我是OpenMP的新手,並且從我已閱讀的有關Microsoft Visual Studio 2010標準的OpenMP 2.0中,全局變量在並行編程中使用時被認爲是麻煩和容易出錯的。我也一直採用這種感覺,因爲我很少發現如何有效地處理全局變量和靜態全局變量,或者根本就沒有處理這個問題。C++ OpenMP for-loop全局變量問題
我有這段代碼運行,但由於在並行塊中創建的局部變量,我沒有得到我正在尋找的答案。我得到8種不同的打印輸出(因爲我在PC上有多少個線程)而不是1個答案。我知道這是因爲在並行塊中創建了局部變量「list」,但如果我移動「list」變量並使其成爲全局變量,則此代碼將不會運行。其實代碼確實運行,但它從來沒有給我一個答案。這是我想的示例代碼修改爲使用一個全球性的「列表」變量:
#pragma omp parallel
{
vector<int> list;
#pragma omp for
for(int i = 0; i < 50000; i++)
{
list.push_back(i);
}
cout << list.size() << endl;
}
輸出:
6250
6250
6250
6250
6250
6250
6250
6250
他們增加了50000,但我沒有得到一個答案用50000,而是分開了。
解決方案:
vector<int> list;
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 50000; i++)
{
cout << i << endl;
#pragma omp critical
{
list.push_back(i);
}
}
}
cout << list.size() << endl;
是你的權利沒有明顯的加快與解決這個問題的實現。即使我沒有嘗試過你的「合併」解決方案,我也喜歡它的聲音。我期待將這個應用到更大的項目,我只是獲得一些經驗,但「合併」解決方案正是我所期待的。 – arnm
如果我記得我會回來並將您的建議發佈在我的結果上。謝謝! – arnm
@cstuts:在並行區域之前預先分配足夠的內存並使用list [i] = i而不是'omp critical {list.push_back(i)}'可能會更快。 – jfs