我的问题是这样的one https://stackoverflow.com/questions/11493265/for-loop-inside-parallel-region。但我想做一些不同的事情...
例如,在我的并行区域内,我想在 4 个线程上运行我的代码。当每个线程进入 for 循环时,我想在 8 个线程上运行我的代码。就像是
#pramga omp parallel num_threads(4)
{
//do something on 4 threads
#pragma omp parallel for num_threads(2)
for(int i=0;i<2;i++){
//do something on 8 threads in total
}
}
那么,有没有办法将每个(4)个正在运行的线程“拆分”为两个(新)线程,以便在 for 循环内有更多(8)个线程正在运行?
你这里有什么 -嵌套并行性 http://docs.oracle.com/cd/E19205-01/819-5270/aewbc/index.html,一个并行部分位于另一个部分内 - 大多数当前支持 OpenMP 的编译器都支持,但默认情况下通常处于关闭状态。您需要设置OMP_NESTED
环境变量为TRUE
,或者在你的程序中调用omp_set_nested(1)
。参见,例如,这个答案 https://stackoverflow.com/a/8303151/463827.
要回答评论中的后续问题,您不需要在 OpenMP 并行 for 循环末尾设置屏障;除非你使用nowait clause http://msdn.microsoft.com/en-us/library/ek5st0e3.aspx,在您的末尾已经存在隐式同步障碍for
环形。而且你不能有障碍insidefor 循环;如果循环迭代没有被线程均匀划分会发生什么?您最终会发现一些线程被“卡住”在其他线程无法到达的屏障处等待。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)