如何仅创建一次OpenMP线程并且不要在不同的并行区域之间杀死它们

问题描述

我有一个数组A_p,每个线程定义为threadprivate。该代码很复杂,并且需要进行一些计算。最后,我想将所有数组简化为一个shared array A

DO J=1,Y
 DO I=1,X
   a=0
   !$omp parallel reduction(+:a)
      a = A_p(I,J)  
   !$omp end parallel
   A(I,J) = A(I,J)+ a
 END DO 
END DO

解决方案有效,但是问题是线程可能在每次迭代时都会创建,这会产生巨大的开销。我想找到一种方法来在两次迭代之间保存线程,因此它们可以只创建一次。

我还尝试了以下解决方案:

!$omp parallel reduction(+:A)
   A = A_p
!$omp end parallel 

,但是似乎为每个线程初始化private变量A会产生一定的开销(顺便说一下,这是多余的,因为已经有threadprivate变量,我们没有确实需要更多的私有数组)。当然,这里的开销小于以前解决方案中观察到的开销,但是对于我来说仍然不够好。

此外,我想问一下OpenMP实现减少的方式。例如,在我介绍的第一个解决方案中,变量a的归约是串行的,还是以树组合的方式实现(实现归约阶段的对数运行时间)?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)