0

Ich versuche, einen ziemlich komplizierten Simulationscode zu parallelisieren, der für Ölfeldberechnungen verwendet wird.Private und öffentliche Variablen in einem Modul und eine Unterroutine in OpenMP

Meine Frage ist, wenn ich eine Variable oder einige zuweisbare Arrays und einige Subroutinen in einem Modul deklarieren kann, dann dieses Modul in einem anderen Modul/Subroutine, die die parallele Region enthält, werden diese Variablen und Arrays als privat betrachtet Jeder Thread (dh sie haben separate Kopien dieser Variablen und Änderungen an Variablen in einem Thread werden von anderen Threads nicht gesehen) oder sie werden geteilt?

So:

module m2 
implicit none 
integer :: global 
contains 

    subroutine s2() 
     implicit none 
     integer :: tid 
     tid = ! Some calculation 
    end subroutine s2 
end module m2 

module m1 
    use m2 
    implicit none 
contains 
    subroutine s1 
     !$omp parallel do 
      do i=1, 9 
       call s2() 
      end do 
     !$omp end parallel do 
    end subroutine s1 
end module m1 

Wird tid und global privat oder gemeinsam genutzt werden?

Jede Hilfe wird sehr geschätzt!

Antwort

1

Modulvariablen sind immer shared in OpenMP, es sei denn, Sie verwenden die threadprivate Direktive. Eine detaillierte Beschreibung von threadprivate finden Sie unter Difference between OpenMP threadprivate and private. So wird global geteilt werden.

Die lokale Variable tid wird im Unterprogramm deklariert und aus der parallelen Region aufgerufen. Daher wird es private sein, es sei denn, es hat das save Attribut.

(Beachten Sie, dass die Initialisierung wie integer :: tid = 0 fügt auch die save implizit, also seien Sie vorsichtig.)

+0

Danke für die Antwort, es klärt die Dinge. Aber gilt dies für Variablen, die in verschachtelten Subroutinen definiert sind? Wie definieren Sie eine andere Subroutine innerhalb von 's2' und haben Variablen darin, sind sie auch privat? –

+1

Ja, sie werden auch privat sein. –