OpenMP

时间:2015-09-09 16:53:35

标签: fortran openmp

在我尝试移植到OpenMP的代码中,我有一个嵌套在外部循环中的并行循环。根据外部循环的迭代,我希望特定的数组可以是sharedreduction(+)。有没有办法在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

0 个答案:

没有答案