OpenMp并行化区域调用子程序,该子程序也调用子程序

时间:2014-03-16 12:40:52

标签: arrays parallel-processing openmp subroutine

我的代码在没有并行化的情况下运行良好。但它没有并行化。 我的代码包含一个包含大小为100x100x100的数组的模块。

real(8), dimension(1:100,1:100,1:100) :: array

此模块位于较低层级,因此可以由任何其他模块调用。然后是另一个模块,它由一个调用子程序的do循环组成。

do i=1,100
  do j=1,100
    do k=1,100
      call some_calculation(i,j,k)
    enddo
  enddo
enddo

子程序some_calculation使用数组(i,j,k)执行一些算术处理,然后更新数组(i,j,k)。输入值i,j,k对应于访问阵列(i,j,k)。但是当我并行化最外层的do循环时

!$OMP PARALLEL DO 
do i=1,100
  do j=1,100
    do k=1,100
      call some_calculation(i,j,k)
    enddo
  enddo
enddo
!$OMP END PARALLE DO

我收到不同的数组结果。有没有人对此有任何线索?谢谢你!

1 个答案:

答案 0 :(得分:1)

你的循环索引应该是私有的:

!$OMP PARALLEL DO private (i,j,k)
do i=1,100
   do j=1,100
      do k=1,100
         call some_calculation(i,j,k)
      enddo
   enddo
enddo
!$OMP END PARALLEL DO