我想实现openMP,但是像我之前的很多其他海报一样,结果只是简化了代码。受到以前答案的启发,我从#pragma omp parallel for
到#pragma omp task
去了,希望能避免一些开销。不幸的是,并行代码仍然是串行速度的两倍。从其他答案看来,正确的过程似乎取决于代码的具体要求,这就是为什么我认为我必须自己提问。使用openmp更好
第一伪代码:
#pragma omp parallel
{
#pragma omp master
while (will be run some hundreds of millions of times)
{
for (between 5 and 20 iterations)
{
#pragma omp task
(something)
}
#pragma omp taskwait <- it is important that all the above tasks are completed before going on
(something)
if (something)
{
(something)
for (between 50 and 200 iterations)
{
#pragma omp task
(something)
}
#pragma omp taskwait
(something)
}
}
}
只有两个for循环可以并行,其余的必须按正确的顺序进行。我想出了将while和master指令放在while循环之外的尝试,以减少创建团队的开销。
我也有点好奇我是否正确使用了taskwait - 规范说明“父任务”被搁置,直到所有的子任务都被执行完毕,但这个术语是否也适用于此,任务区域不嵌套。
任何人都可以想出一个更好的方式使用openMP,这样我实际上可以加快速度吗?
编辑:while循环中的每一步都依赖于前面的所有步骤,因此它们必须连续完成,并在最后进行更新。如果有人想知道,它是模拟神经网络的“事件驱动算法”的实现。
for循环的每次迭代需要多长时间?如果任务规模很小,很可能无法在这里获得加速。此外为什么'#pragma omp task'会更快,然后'#pragma omp for'?毕竟后者应该能够以更少的管理开销逃脱。对我来说,似乎如果速度更快,那么您的情况可能使用了错误的调度模式。关于taskwait:据我了解,'master'部分应该是你的父任务(或者'parallel'部分,但似乎不太可能) – Grizzly 2012-02-19 19:43:49
我知道任务会更快,因为对一个老问题的回答说了些什么“如果for循环中的迭代次数太少,则最好使用任务代替”。在序列情况下,1.7秒内可能经历10000次while循环。考虑到其他设置,对于第二个for循环的每次迭代,球估计将为1.0-0.5微秒。我知道它很短,但被告知我低估了并行化的力量,并决定给它一个镜头:) – Kaare 2012-02-19 19:54:02
这听起来好像你需要考虑新算法或新的并行处理范例,或者可能甚至两个。 – talonmies 2012-02-19 20:07:34