Использование openmp для поиска максимального значения в более чем одном цикле - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть три цикла Do по трем параметрам, и я хочу использовать openmp для ускорения вычислений, чтобы найти максимальное значение F как функцию от A и в конечном итоге построить F_max против A. Вот моя попытка, которая использует только несколько ядерв начале, но затем падает до одного.Если я пропущу критическое утверждение, оно не даст правильное максимальное значение.Как я могу заставить это работать должным образом?Любая помощь будет принята с благодарностью.

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 голосов
/ 24 сентября 2018

Вы можете попробовать адаптировать следующий код.Надеюсь, поможет.Ключевой особенностью является сокращение 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 независимо от количества потоков

...