2009-09-25 44 views
1

我有一段應該與OpenMP並行的Fortran90程序。Fortran90中的非平凡私人數據OpenMP

!$omp parallel num_threads(8) & 
!$omp private(j, s, prop_states) & 
!$omp firstprivate(targets, pulses) 
    ! ... modify something in pulses. targets(s)%ham contains pointers to 
    ! elements of pulses ... 
    do s = 1, n_systems 
    prop_states(s) = targets(s)%psi_i 
    call prop(prop_states(s), targets(s)%grid, targets(s)%ham, & 
    &   targets(s)%work, para) 
    end do 
!$omp end parallel 

我不確定什麼是複雜的數據結構是否能夠對每個線程專用(以及如何應該是這樣的 - 是firstprivate正確的嗎?)。在上面的示例代碼中,targets具有相當複雜的用戶定義類型,具有相同的複雜子字段。例如,targets(s)%ham%op(1)%pulse是指向數組pulses的某個元素的指針。此外,targets(s)%work包含分配的空間以用作快速傅立葉變換中的工作陣列。

顯然,每個線程都需要保持targetspulses的獨立副本,並獨立維護兩者之間的指針。在我看來,這可能與OpenMP的自動內存管理有點太過分了。這是正確的,還是應該開箱即用?

當然的替代方法是在每個線程(存儲在數組中)中創建原始數據的副本,並在調用prop時使用此私有複製數據。

回答

0

從我閱讀的OpenMP 2.5標準中,您不能使用private(或firstprivatethreadprivate)子句中的Fortran指針的目標,這似乎排除了您的代碼。話雖如此,這並不是我曾經在OpenMP上嘗試過的,所以如果你前進並獲得任何地方,請告訴我們。

firstprivate如果您的私有變量在進入並行區域時被初始化爲並行區域入口處的相同名稱的變量的值,則這是正確的。

我想你可能必須執行你的計劃B.