使用openmp在多个循环中查找最大值

时间:2018-09-23 14:26:31

标签: fortran openmp

我对三个参数有三个Do循环,我想使用openmp来加快计算速度,以找到作为A的函数的F的最大值,并最终绘制F_max vsA。这是我的尝试,仅使用多核在开始时,然后下降到一个。如果我忽略了关键的陈述,它不会产生正确的最大值。我该如何使其正常工作?任何帮助将不胜感激。

PROGRAM maxfunction
    Do i=0, n1
        A= i*1.0
        Max=0
        Do j=0, n2
            B=j*1.0
            Do k=0,n3
                C=k*1.0
                F=findF(A,B,C)
                 If( F > Max) Then 
                     Max= F
                 endif
            Enddo
        Enddo
    Enddo 
ENDPROGRAM

FUNCTION findF(a,b,c)
    findF= g1(a,b,c) + g2(a,b,c) +g3(a,b,c)
    !returns value of findF
ENDFUNCTION findF

function g1(a,b,c)
    !do stuff with a,b,c
    !returns value g1
endfunction g1

function g2(a,b,c)
    !do stuff with a,b,c
    !returns value g2
endfunction g2

function g3(a,b,c)
    !do stuff with a,b,c
    !returns value g3
endfunction g3

代码具有这种最小的结构。

1 个答案:

答案 0 :(得分:0)

您可以尝试改编以下代码。希望能帮助到你。关键功能是减少OMP,请随时阅读该主题。 https://computing.llnl.gov/tutorials/openMP/

      PROGRAM maxfunction
            double precision Maximum
            n1 = 10
            n2 = 20
            n3 = 30
            Maximum = -1000000.0
c$OMP PARALLEL DO DEFAULT(SHARED)
c$OMP+ SHARED(n1, n2, n3)
c$OMP+ PRIVATE(i,j, A, B, C, F)
c$OMP+ reduction(max: Maximum)
          Do i=0, n1
              A= i*1.0
              Do j=0, n2
                  B=j*1.0
                  Do k=0,n3
                      C=k*1.0
                      F=findF(A,B,C)
                      If( F > Maximum) Then 
                          Maximum= F
                       endif
                  Enddo
              Enddo
          Enddo 
c$OMP END PARALLEL DO
      print *, Maximum
      ENDPROGRAM

  function g1(a,b,c)
      g1 = a
  endfunction g1

  function g2(a,b,c)
      g2 = b
  endfunction g2

  function g3(a,b,c)
      g3 = -c
  endfunction g3

无论线程数量多少,此代码都会返回30.0