相关疑难解决方法(0)

系统地并行化fortran 2008`并发`,可能与openmp

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语法?

parallel-processing fortran openmp

8
推荐指数
1
解决办法
4807
查看次数

我什么时候应该使用 DO CONCURRENT,什么时候应该使用 OpenMP?

我知道这个这个,但我再次询问,因为第一个链接现在已经很旧了,第二个链接似乎没有得出结论性的答案。达成共识了吗?

我的问题很简单:

我有一个循环,其中包含可以DO同时运行的元素。我该使用哪种方法?

下面是在简单立方晶格上生成粒子的代码。

  • npart是粒子数
  • npart_edgenpart_face分别是沿边和面的
  • space是晶格间距
  • RxRyRz是位置数组
  • x , y , z是决定晶格位置的临时变量

请注意,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)

或者我使用 …

concurrency fortran simd openmp fortran2008

6
推荐指数
1
解决办法
3318
查看次数