Fortran OMP Parallel Do for a Do While loop



最近我一直在阅读和玩Fortran 95中的OpenMPparallel do。但是,我仍然没有弄清楚如何在下面的代码中使用parallel do

I=1
DO WHILE I<100
A=2*I
B=3*I
C=A+B
SUM(I)=C
I=I+1
END DO

在 do 循环和!$OMP END PARALLEL DO之前使用简单的!$OMP PARALLEL DO似乎不起作用。我已经阅读了一些关于私有和共享变量的内容,但我认为上面代码的每个连续循环都是完全独立的。任何帮助将不胜感激。

parallel do构造不适用于do while循环。您需要将do while循环更改为标准DO循环。这是来自 OpenMP 4.0 标准,第 https://www.openmp.org/wp-content/uploads/OpenMP4.0.0.pdf 页的parallel do构造,第 59 页:

• 关联的do-loops必须是结构化块。

• 只有最内层关联循环的迭代可能会被CYCLE语句缩减。

• 除DO语句外,关联循环中的任何语句都不能导致分支退出循环。

do-loop迭代变量必须是整数类型。

• 没有循环控制,do-loop不能是DO WHILEDO循环。

以下示例可能有助于理解您所概述的方法。 它显示了 !$OMP 的用法,还标识了用于循环每次迭代的线程。 我将 SUM 更改为 SUMI,以保留 SUM 作为内在函数。 希望你能在此基础上再接再厉。

use omp_lib
real sumi(99), a,b,c
integer thread_used(0:9), I
nThreads = omp_get_max_threads ()
thread_used = 0
!$OMP PARALLEL DO                   &
!$OMP  SHARED  (SUMI,thread_used)   &
!$OMP  PRIVATE (i,a,b,c,iThread)
DO I = 1,99
iThread  = omp_get_thread_num  ()
thread_used(iThread) = thread_used(iThread) + 1
A=2*I
B=3*I
C=A+B
SUMI(I)=C
END DO
!$OMP END PARALLEL DO
write (*,*) sum (SUMI)
do i = 0, nThreads
write (*,*) i, thread_used(i)
end do
end

最新更新