什麼是並行編程中的理想數據結構,在我的情況下是OpenMP。理想的數據結構與OpenMP
#pragma omp parallel for
for(int i = 0; i < N; i++)
{
if(table[i] == true)
container.insert(i); // ?? what kind
}
在這個例子中,如果我們使用一個相似大小的表格,這可能很簡單。 C++中用於共享內存並行編程的更一般的數據結構是什麼?
什麼是並行編程中的理想數據結構,在我的情況下是OpenMP。理想的數據結構與OpenMP
#pragma omp parallel for
for(int i = 0; i < N; i++)
{
if(table[i] == true)
container.insert(i); // ?? what kind
}
在這個例子中,如果我們使用一個相似大小的表格,這可能很簡單。 C++中用於共享內存並行編程的更一般的數據結構是什麼?
最好不要依賴於共享數據結構(因爲你必須在某個時刻依靠鎖,這會減慢速度)。相反,讓每個線程寫入其自己的結構,並在並行部分完成後合併結果。
該陣列是並行編程的理想數據結構。
我不同意@Oli Charlesworth不願意依賴共享數據結構 - 畢竟OpenMP是關於共享內存並行化的,它提供了程序員需要的工具來確保數據安全。
在這種特殊情況下,數組不計數,因爲代碼是*收集*一些數據(或減少,因爲你想調用它)。這將從原始數組中選擇一些元素。爲了使數組正常工作,它必須爲每個工作線程分配一個預先指定的元素,以避免鎖,等待狀態和競態條件,但在這種情況下,您怎麼知道最終數組將具有多少個元素?你爲每個線程分配了多少個元素?然後,您必須允許中央存儲庫添加每個結果,需要鎖定對結構的訪問權限,從而損害性能。 – 2010-11-15 18:20:02
因此,在數組的情況下,我需要一個單一的大型數組,然後爲每個線程設置一組單獨的計數器,而不需要鎖? – ennetws 2010-11-16 20:12:39
@ennetws:是的,沒錯。 – 2010-11-16 22:24:34
你說得對。不幸的是,OpenMPs擁有'reduction'只支持基本類型。 – 2010-11-15 08:41:44
所以每個線程都會有任何數據結構並收集最終結果。多謝你們。 – ennetws 2010-11-16 20:08:40