最近我一直在阅读和玩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 WHILE
或DO
循环。
以下示例可能有助于理解您所概述的方法。 它显示了 !$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