簡體   English   中英

關鍵部分openMP

[英]Critical Sections openMP

我想知道我們需要在哪里設置關鍵部分?

如果有多個線程具有一個共享數組,並且每個線程都想寫在不同的位置,即使每個線程都寫到數組中的不同位置,它也都需要放在關鍵部分嗎?

可以說我有二維數組M [3] [3],initial_array [3]和一些雙精度變量,我想計算一些東西並將其存儲在M的第一列。我可以使用for循環,但是我想與openMP一起使用,所以我做了:

 omp_set_num_threads(3);
 #pragma omp parallel shared(M,variable)
 {  
     int id = omp_get_thread_num();
     double init = initial_array[id]*variable;
     M[id][0] = init;
 }   

它工作正常,但我知道它可能導致死鎖或運行時間不好。 我的意思是,如果我有更多的線程甚至更大的線程,該怎么辦。設置關鍵部分的正確方法是什么? 我想問的另一件事是有關initial_array,是否也需要共享?

這是安全代碼。

數組中的隨機訪問不會導致對數組中其他元素的競爭。 只要您繼續並發地讀寫數組中未共享的元素,您就永遠不會遇到競爭狀況。

請記住,取決於元素的類型和大小,讀取可以與寫入競爭。 您的示例顯示為double ,如果您在同一元素上同時進行讀取操作和寫入操作,我將很擔心。 在寫入過程中可能會發生上下文切換,但這取決於您的體系結構/平台。 無論如何,您沒有這樣做,但是值得一提。

由於您正在訪問內存的不同部分(數組的不同索引),因此我認為並發性沒有任何問題,但是如果您的內核具有專用的L1高速緩存,我看到的唯一問題是性能下降。

在這種情況下,由於高速緩存一致性會導致性能下降,其中一個更新索引,使其他索引無效,執行回寫等操作。對於少量線程/核心,這不是問題,但對於在大量核心上運行的線程,它可以確保它。 由於線程所運行的數據並不是真正獨立的 ,因此它們將作為高速緩存中的數據塊讀取(如果您正在訪問M [0] [0],則不僅M [0] [0]會被讀入緩存,但M [0] [0]至M [n] [col],其中n取決於緩存塊大小。 如果塊很大,則可能包含更多共享數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM