【发布时间】:2011-08-19 11:50:17
【问题描述】:
我有一个我不想并行化的 for 循环,它调用一个我想并行化的函数(其中有一个我想并行化的 for 循环)。我想将并行区域放在整个区域之外,以便我的线程只创建一次(以减少线程创建的开销)。
但是,目前我有一个 omp single 覆盖 for 循环,它调用函数和函数内部的 omp for 来处理内部 for 循环。它手,根据OMP single hangs inside for,这是因为这样做是非法的!
如果我不能那样做,我该怎么做?我想确保只有一个线程运行外部 for 循环并调用函数,但在函数内部我可以获得完全的并行性。
这可能吗?有什么想法吗?
【问题讨论】:
-
你知道线程创建开销真的是个问题吗?良好的 OpenMP 实现可能会为您关心这一点,当没有并行区域处于活动状态时,保持一些线程在内部停放。
-
我不确定我正在使用什么 OpenMP 实现(如果有帮助,我正在使用 GCC 4.3.3),但我不确定它是否这样做。当我在函数内部有一个被多次调用的并行区域时,我似乎得到了显着的减速(而不是加速),所以这表明我的实现可能没有这样做。
-
您可以很容易地检查这一点,方法是要求每个线程在并行区域的开头打印其
pthread_self()值,并检查线程是否被重用或重新创建。 -
@Alexey - 谢谢。我已经尝试过了,似乎线程正在被重新使用。我现在只是有点困惑为什么我的代码实际上运行速度较慢......但我猜这是一个不同的问题!
标签: c openmp parallel-processing