【发布时间】: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