所以我试图了解任务分解的工作原理以及它为什么似乎不会提高计算速度。所以我制作了一个简单的系统来简单地排序数组。只需使用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故障(它只是由于堆栈上没有足够的空间)而侧面的值只是每个线程将数组划分为计算的一侧 - 它不应该是为什么任务的一个因素分解提供了极少量的加速。
答案 0 :(得分:1)
不,不,否,不,不!
简单地添加线程不会加速任何事情,除非:
1)任务是完全独立的(也许它们是,也许它们不是)
2)每个任务都可以分配给 OWN CPU (或核心)
3)与任务执行的实际工作相比,管理线程的成本很小。
建议:
如果您使用的是“gcc”,请尝试运行“gprof”以确定实施中瓶颈的确切位置。还要确保您的线程库(例如pthreads)正在利用工作站上的所有CPU /核心:
PS:很大程度上取决于:
a)您的操作系统(Linux?Mac?Windows?)
b)您的编译器(GCC?MSVC?)
c)您的线程库