0

我想並行化一個用於油田計算的相當複雜的模擬代碼。我的問題是,如果我可以在一個模塊中聲明一個變量或一些可分配數組和一些子例程,然後在另一個包含並行區域的模塊/子例程中使用這個模塊,這些變量和數組是否會被認爲是私有的每個線程(即它們將具有這些變量的單獨副本,並且對線程中的變量所做的更改不會被其他線程看到),或者它們將被共享?模塊內部的私有和公共變量以及OpenMP中的子例程

像這樣:

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 

tidglobal是私人或共用?

任何幫助,非常感謝!

回答

1

模塊變量始終shared OpenMP中,除非您使用threadprivate指令。有關threadprivate的詳細說明,請參閱Difference between OpenMP threadprivate and private。所以global將被共享。

局部變量tid在子例程中聲明並從並行區域調用。因此它將是private,除非它具有save屬性。

(注意像integer :: tid = 0在初始化還增加了save含蓄,所以要小心。)

+0

感謝您的回答,它清除的東西了。但這是否適用於嵌套子例程中定義的變量?就像在's2'中定義另一個子例程並且有變量一樣,它們也會是私有的? –

+1

是的,他們也會是私人的。 –