2013-10-12 37 views
2

對OpenMP中私有變量和共享變量的基本疑問。代碼看起來如下所示。數組arr包含從1到10的變量,它是全局的。在openmp中,默認情況下fortran子例程中的局部變量是私有的嗎?

PROGRAM TEST 
IMPLICIT NONE 
INTEGER :: i,j 
DO i=1,10 
    call check() 
END DO 
END PROGRAM TEST 

SUBROUTINE CHECK() 
IMPLICIT NONE 
INTEGER :: testvar,i 
!$OMP PARALLEL DO 
DO i = 1,10 
    testvar = a(i)-1 
    print testvar 
END DO 
!$END PARALLEL DO 
END SUBROUTINE CHECK 

問題:是對變量testvar其是本地默認子程序私有?這裏的一個主要區別是!$OMP PARALLEL只在子程序內部啓動,因此這不是孤兒指令。任何幫助是極大的讚賞。

回答

4

在Fortran中,循環的索引變量自動變爲私有。所有其他變量是共享

如果您從並行區域調用subroutine,則該子例程中的本地變量對於該線程也是私有的。

要回答你的問題:雖然testvar是本地子程序,它是所有線程共享,爲並行段位於子程序中也是如此。如果將平行部分移動到主程序中,然後調用子例程,則情況會有所不同。

+0

但是當我試圖在一個子程序中使用一個變量時,即使沒有聲明它是私有的,例如** testvar **在上面的例子中它的行爲就好像它是私有的。爲什麼這樣? – Vaidyanathan

+0

你怎麼知道?用1到10的數字填充「a」。如果'testvar'確實是私人的,那麼不可能發生一個數字被打印兩次 - 但它確實! –

+0

它不是爲我打印出來的。它只打印一次。我不確定它是否依賴於編譯器 – Vaidyanathan

相關問題