我的代码在没有并行化的情况下运行良好。但它没有并行化。 我的代码包含一个包含大小为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
我收到不同的数组结果。有没有人对此有任何线索?谢谢你!
答案 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