Parallel processing Fortran OMP并行Do for a Do While循环
到最近为止,我一直在阅读Fortran 95中的OpenMPParallel processing Fortran OMP并行Do for a Do While循环,parallel-processing,fortran,openmp,Parallel Processing,Fortran,Openmp,到最近为止,我一直在阅读Fortran 95中的OpenMP并行do。但是,我仍然没有弄清楚在下面这样的代码中如何使用并行do: I=1 DO WHILE I<100 A=2*I B=3*I C=A+B SUM(I)=C I=I+1 END DO I=1 DO WHILE I并行DO构造不适用于DO WHILE循环。您需要将do while循环更改为标准do循环。这是OpenMP 4.0标准中关于并行do的部分,第59页: •相关do循环必须是结构化块 •只有最里
并行do
。但是,我仍然没有弄清楚在下面这样的代码中如何使用并行do
:
I=1
DO WHILE I<100
A=2*I
B=3*I
C=A+B
SUM(I)=C
I=I+1
END DO
I=1
DO WHILE I并行DO
构造不适用于DO WHILE
循环。您需要将do while
循环更改为标准do
循环。这是OpenMP 4.0标准中关于并行do的部分,第59页:
•相关do循环必须是结构化块
•只有最里面的相关循环的迭代可以通过循环
语句进行缩减
•除了DO
语句外,相关循环中的任何语句都不会导致循环外的分支
•do循环迭代变量必须为整数类型
•do循环不能是
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
你的代码对我来说毫无意义。
A
、B
、C
是标量还是向量?请使用一些实际的可编译代码。别忘了带上标签并阅读。这个do-while
看起来可以改成正常的do
,但里面的代码没有感觉,或者至少不一致。@vladimirF我编辑了代码。我认为现在确实有道理了。A、 B是简单的整数,矩阵和在每次迭代中只存储A和B的和。希望它有意义。