在我尝试移植到OpenMP的代码中,我有一个嵌套在外部循环中的并行循环。根据外部循环的迭代,我希望特定的数组可以是shared
或reduction(+)
。有没有办法在Fortran中做到这一点?
这是我想要的模型:
do i = 1, 2
!$omp if(i.eq.1) parallel do reduction(+:foo)
!$omp if(i.eq.2) parallel do shared(foo)
do j = 1,j_max
work on foo
enddo
!$omp end parallel
enddo
openMP conditional pragma "if else"中的讨论表明,在执行期间无法修改调度。这也是共享/私人/减少/等等的情况吗?
一个明显的做法是创建foo_1(简化:+)和foo_2(共享),在i上第一次迭代后将foo_1复制到foo_2,然后在循环中使用if语句来引用正确的数组。但那并不是非常优雅。我希望有更好/更聪明/更清洁的方法来做到这一点。
编辑:对于缺乏想象力的人来说,这是我的替代
的伪代码版本do i = 1, 2
!$omp parallel do reduction(+:foo_1), shared(foo_2)
do j = 1,j_max
if( i .eq. 1 ) then
work on foo_1
else
work on foo_2
endif
enddo
!$omp end parallel
foo_2 = foo_1
enddo