Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing Fortran OMP并行Do for a Do While循环_Parallel Processing_Fortran_Openmp - Fatal编程技术网

Parallel processing Fortran OMP并行Do for a Do While循环

Parallel 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循环必须是结构化块 •只有最里

到最近为止,我一直在阅读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循环迭代变量必须为整数类型


•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的和。希望它有意义。