2010-11-15 55 views
0

什麼是並行編程中的理想數據結構,在我的情況下是OpenMP。理想的數據結構與OpenMP

#pragma omp parallel for 
for(int i = 0; i < N; i++) 
{ 
    if(table[i] == true) 
     container.insert(i); // ?? what kind 
} 

在這個例子中,如果我們使用一個相似大小的表格,這可能很簡單。 C++中用於共享內存並行編程的更一般的數據結構是什麼?

回答

1

最好不要依賴於共享數據結構(因爲你必須在某個時刻依靠鎖,這會減慢速度)。相反,讓每個線程寫入其自己的結構,並在並行部分完成後合併結果。

+1

你說得對。不幸的是,OpenMPs擁有'reduction'只支持基本類型。 – 2010-11-15 08:41:44

+0

所以每個線程都會有任何數據結構並收集最終結果。多謝你們。 – ennetws 2010-11-16 20:08:40

1

該陣列是並行編程的理想數據結構。

我不同意@Oli Charlesworth不願意依賴共享數據結構 - 畢竟OpenMP是關於共享內存並行化的,它提供了程序員需要的工具來確保數據安全。

+0

在這種特殊情況下,數組不計數,因爲代碼是*收集*一些數據(或減少,因爲你想調用它)。這將從原始數組中選擇一些元素。爲了使數組正常工作,它必須爲每個工作線程分配一個預先指定的元素,以避免鎖,等待狀態和競態條件,但在這種情況下,您怎麼知道最終數組將具有多少個元素?你爲每個線程分配了多少個元素?然後,您必須允許中央存儲庫添加每個結果,需要鎖定對結構的訪問權限,從而損害性能。 – 2010-11-15 18:20:02

+0

因此,在數組的情況下,我需要一個單一的大型數組,然後爲每個線程設置一組單獨的計數器,而不需要鎖? – ennetws 2010-11-16 20:12:39

+0

@ennetws:是的,沒錯。 – 2010-11-16 22:24:34