如何解决如何仅创建一次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 举报,一经查实,本站将立刻删除。