【问题标题】:Task Decomposition任务分解
【发布时间】:2016-01-14 17:50:06
【问题描述】:

所以我试图了解任务分解是如何工作的,以及为什么它似乎并没有提高我的计算速度。所以我制作了一个简单地对数组进行排序的并行系统。仅使用 4 个线程,我得到了相当不错的速度,但是当我实现任务分解时,它似乎并没有加快我的计算速度,我不明白为什么。

所以对于我的系统,我为每个线程创建了一个任务队列。然后每个线程开始一个一个地计算每个任务,直到它的堆栈为空。此时,不是让线程等待所有其他线程完成,而是具有空堆栈的线程将搜索以查找具有任务的堆栈并从中窃取 - 有效地最大化每个线程可以完成的工作量。

但问题是,虽然我加快了速度,但速度非常小,我似乎无法弄清楚原因。有没有可能是线程等待的时间太短以至于几乎不影响计算时间?或者访问其他线程堆栈所需的时间抵消了窃取其他堆栈上的任务的大部分加速?

这是我的结果,你可以看看发生了什么:

    parallel_for (1 Thread)    parallel_for (4 Threads)   parallel_for (4 Threads) + Task Decomposition
1         seg fault                    seg fault                   seg fault
10        21.993                       seg fault                   seg fault
100       21.7294                      5.42989                     seg fault
1000      21.5556                      5.2258                      5.38024
10000     21.5513                      5.43617                     5.3735
100000    21.6238                      5.4557                      5.41096
1000000   21.5447                      5.9712                      5.9325
10000000  21.5898                      10.8605                     10.753

您可以忽略 seg 错误(它只是由于堆栈上没有足够的空间),并且侧面的值只是每个线程将要计算的数组划分为的一侧 - 它不应该是为什么任务的一个因素分解提供了极少的加速。

【问题讨论】:

  • 问:什么平台?问:什么编译器?问:您是否进行过任何分析(包括profiling)来定位瓶颈?

标签: c multithreading task scheduled-tasks


【解决方案1】:

不,不,,不,不!

简单地添加线程不会加速任何事情,除非:

1) 任务是完全独立的(也许是,也许不是)

2) 每个任务都可以分配给它的OWN CPU(或核心)

3) 与任务执行的实际工作相比,管理线程的成本很小。

建议:

如果您使用“gcc”,请尝试运行“gprof”来确定您的实现中可能存在的瓶颈。还要确保您的线程库(例如 pthreads)正在利用工作站上的所有 CPU/内核:

PS:很大程度上取决于:

a) 您的操作系统(Linux?Mac?Windows?)

b) 你的编译器(GCC?MSVC?)

c) 你的线程库

【讨论】:

  • 每个线程都有自己的核心。问题是,一旦线程完成了它自己堆栈上的所有任务,它就会寻找其他堆栈上的任务并执行它们。为什么这不会提高性能?我正在充分利用线程
  • 是 - 如果原本会在一个线程上被阻塞的任务可以改为在不同的线程上运行(您确定在不同的核心上运行) - 那么这提高性能。同样:如果可能存在瓶颈,您绝对应该profile您的应用程序。瓶颈可能是什么——或者什么工具可以帮助分析——完全取决于你的平台(Linux?Windows?)和编译器(GCC?MSVC?CLang?)
猜你喜欢
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 2023-03-28
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多