到目前为止,我一直在阅读和使用Fortran 95中的OpenMP parallel 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 PARALLEL DO
,而!$OMP END PARALLEL DO
似乎无法正常工作。我已经阅读了有关私有和共享变量的一些内容,但我认为上面代码的每个连续循环都是完全独立的。非常感谢任何帮助。
答案 0 :(得分:1)
parallel do
构造不适用于do while
循环。您需要将do while
循环更改为标准DO
循环。这是来自https://www.openmp.org/wp-content/uploads/OpenMP4.0.0.pdf的parallel do
构造的OpenMP 4.0标准,第59页:
•关联的 do-loops 必须是结构化块。
•CYCLE
语句只能缩减最内层关联循环的迭代。
•除DO
语句之外的关联循环中没有语句可能导致循环中的分支。
• do-loop 迭代变量必须是整数类型。
• do-loop 不能是没有循环控制的DO WHILE
或DO
循环。
答案 1 :(得分:0)
以下示例可能有助于您了解所概述的方法。 它显示了!$ 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