fortran 2008 do concurrent构造是一个do循环,它告诉编译器没有迭代会影响任何其他迭代.因此可以安全地并行化.
一个有效的例子:
program main
implicit none
integer :: i
integer, dimension(10) :: array
do concurrent( i= 1: 10)
array(i) = i
end do
end program main
Run Code Online (Sandbox Code Playgroud)
迭代可以按任何顺序完成.你可以在这里阅读更多相关信息.
据我所知,gfortran不会自动并行化这些do concurrent循环,而我记得有关gfortran扩散列表的邮件(这里).它只是将它们转换为经典do循环.
我的问题:你知道一种系统地并行化do concurrent循环的方法吗?例如,使用系统的 openmp语法?
我知道这个和这个,但我再次询问,因为第一个链接现在已经很旧了,第二个链接似乎没有得出结论性的答案。达成共识了吗?
我的问题很简单:
我有一个循环,其中包含可以DO同时运行的元素。我该使用哪种方法?
下面是在简单立方晶格上生成粒子的代码。
请注意,x、y 和 z 在 CONCURRENT 情况下必须是数组,但在 OpenMP 情况下则不然,因为它们可以定义为 PRIVATE。
我也使用DO CONCURRENT(据我从上面的链接了解,使用SIMD):
DO CONCURRENT (i = 1, npart)
x(i) = MODULO(i-1, npart_edge)
Rx(i) = space*x(i)
y(i) = MODULO( ( (i-1) / npart_edge ), npart_edge)
Ry(i) = space*y(i)
z(i) = (i-1) / npart_face
Rz(i) = space*z(i)
END DO
Run Code Online (Sandbox Code Playgroud)
或者我使用 …