2015-02-09 64 views
1

我想並行化函數S並鎖定每個節點,但我一直在獲取核心轉儲。我試圖在圖的每個節點中使用一個鎖。如果我在我的節點上使用單個鎖,它將起作用。在openMP中使用lock轉儲的核心

for (l = 0; l < n; l++) 
omp_init_lock(&(lock[l])); 

#pragma omp parallel for num_threads(16)default(none) private(v)shared(n,Xof,lock) 

for(v = 0; v < n; v++) { 
    omp_set_lock(&(lock[v])); 
    if(Xof[v] == NYC) 
    { 
     S(v); 
     } 
    omp_unset_lock(&(lock[v])); 
} 
+0

你是如何申報鎖定的? 是否有其他地方你正在訪問可能導致數據競爭的共享狀態? – user2548418 2015-02-10 01:35:20

+0

omp_lock_t lock [n]; (l = 0; l dibid 2015-02-10 07:12:14

+0

問題是,當我使用一個單一的鎖,我沒有得到任何核心轉儲 – dibid 2015-02-10 07:12:38

回答

0

這似乎是最可能的原因是,有一個數據的比賽中S.

(也許有一些嵌入式狀態)

測試,這將是使用N-鎖,但只有一個線程的方法。如果這不會導致核心轉儲,那麼S最有可能有數據競爭。

如果它確實會導致核心轉儲,那麼您最初的假設是由於鎖定而導致的。從可見的代碼中,我沒有看到任何明顯的錯誤。我可能會刪除共享條款,因爲它是多餘的,但我不認爲會產生影響。

+0

謝謝,/我用一個線程試了一下,它工作。 S()中應該有一個數據競賽, – dibid 2015-02-10 19:25:33