Fortran OMP并行执行Do while循环

时间:2018-06-03 00:38:28

标签: parallel-processing fortran openmp

到目前为止,我一直在阅读和使用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似乎无法正常工作。我已经阅读了有关私有和共享变量的一些内容,但我认为上面代码的每个连续循环都是完全独立的。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

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

CYCLE语句只能缩减最内层关联循环的迭代。

•除DO语句之外的关联循环中没有语句可能导致循环中的分支。

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

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

答案 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