Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 系统地并行fortran 2008“执行并发”,可能使用openmp_Parallel Processing_Fortran_Openmp - Fatal编程技术网

Parallel processing 系统地并行fortran 2008“执行并发”,可能使用openmp

Parallel processing 系统地并行fortran 2008“执行并发”,可能使用openmp,parallel-processing,fortran,openmp,Parallel Processing,Fortran,Openmp,fortran 2008do 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 迭代可以按任何顺序进行。你可以阅读更多关于它的

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
迭代可以按任何顺序进行。你可以阅读更多关于它的内容

据我所知,gfortran不会自动并行化这些
do concurrent
循环,而我记得有一封gfortran扩散列表邮件是关于这样做的()。它只是将它们转换为经典的
do
循环


我的问题:你知道一种系统化并行
并发
循环的方法吗?例如,使用系统化openmp语法?

我不确定您所说的“系统化并行执行并发循环的方法”是什么意思。但是,要简单地使用OpenMP并行普通的
do
循环,您可以使用以下方法:

!$omp parallel private (i)
!$omp do
do i = 1,10
    array(i) = i
end do
!$omp end do
!$omp end parallel

这就是你想要的吗?

自动完成并不是那么容易。
DO CONCURRENT
构造有一个forall头,这意味着它可以接受多个循环、索引变量定义和掩码。基本上,您需要替换:

DO CONCURRENT([<type-spec> :: ]<forall-triplet-spec 1>, <forall-triplet-spec 2>, ...[, <scalar-mask-expression>])
  <block>
END DO
将成为:

!$omp parallel workshare
FORALL <forall-header>
  <block>
END FORALL
!$omp end parallel workshare
$并行工作共享
福尔
端孔
!$omp端并行工作共享
综上所述,我能想到的唯一系统方法是系统地浏览源代码,搜索
DO CONCURRENT
,并根据forall头和循环体的内容,系统地将其替换为上面转换的构造之一


编辑:目前不鼓励使用OpenMP
workshare
指令。事实证明,在编译过程中,至少英特尔Fortran编译器和GCC在OpenMP
workshare
指令中对所有
语句和结构进行了序列化,并在编译过程中使用OpenMP
单个
指令对其进行了包围,这不会带来任何加速。其他编译器可能会以不同的方式实现它,但如果要实现可移植性能,最好避免使用它。

对于模糊的“系统性”表示抱歉。例如,我可以grep或awk
执行并发操作吗;XX<代码>结束do
代码中的任何地方,并用始终相同的openmp语法替换它(例如,sed或awk)。不应该是特定于事件的(当然是循环变量)。你的答案可能会在这方面有所帮助,但对于介于
do concurrent
end do
之间的所有类型的东西,它的语法是否总是正确的呢?据我所知,考虑到
do concurrent
构造中可能存在的限制,这应该足够了-希望更有知识的人能在这里插话。我担心的一点是,当使用
do concurrent
构造时,编译器会检查您在该构造中所做的操作是否符合Fortran标准,但如果您使用sed/awk等,则不会发生这种情况。因此,如果您犯了错误,这种简单的翻译可能不合适,并且可能导致错误意外结果,可能很难跟踪。如果您仍在跟踪中,请不要将
用于所有
工作共享
。请参阅下面的五月更新答案。感谢您的更新。你有没有关于这种不受鼓励的行为的资料来源呢?有了GCC,你可以看一下。有些结构是并行的,例如数组分配,但
FORALL
不在其中。对于其他编译器,您可以查看汇编输出。我还应该补充一点,编译器供应商实际上正在解决与您试图解决的问题完全相同的问题:)
DO CONCURRENT <forall-header>
  <block>
END DO
!$omp parallel workshare
FORALL <forall-header>
  <block>
END FORALL
!$omp end parallel workshare