這是在F90中,但這個問題適用於任何支持OpenMP的語言。對於需要多個存儲陣列的模擬代碼結構數據的典型方式進行時間積分會(2維現在):告訴陣列的OpenMP線程部分是隻讀的
REAL, DIMENSION(imax,jmax,n_sub_timesteps) :: vars
哪些隨後將被類似更新:
DO J = 1, jmax
DO I = 1, imax
vars(I,J,2) = func(vars(:,:,1))
END DO
END DO
根據我的經驗,OpenMP不會實際並行化這些循環,因爲它認爲vars
不是線程安全的。但對程序員來說,顯然是這樣的。
讓我們假設對於進一步的實際情況,使vars
線程本地將數據複製到它太昂貴。
那麼,有沒有辦法輕輕提示(又名脅迫)OpenMP到不鎖定vars
,因爲它可能不知道沒有線程依賴性問題,但實際上沒有?我知道有一些方法可以告訴它某些東西不是線程安全的並且需要鎖定,但有沒有一種方法可以指定反轉而不爲每個線程創建副本?