對不起,如果標題沒有準確描述這一點!我是 OMP 的新手并試圖使這個回圈并行。我在關鍵、原子和鎖方面苦苦掙扎,但無法使其正常作業。b 是大小為 n 的雙精度陣列。
結果和我去掉omp代碼的時候不一樣
我的真實代碼更復雜,但如果我能理解 OMP 在這方面的使用,那將是一個很大的幫助
#pragma omp parallel
for(int i = 0; i < n; i )
{
double v = 0;
#pragma omp critical
for (int j=i-1; j <= i 1; j )
if (j >= 0 && j < n)
v = b[j];
b[i] = somecalculation(v);
}
uj5u.com熱心網友回復:
這里有兩個問題:
你使用
#pragma omp parallel但它看起來像你想要的#pragma omp parallel for。您撰寫它的方式,每個執行緒都執行回圈的每次迭代,實際上多次計算所有內容您的臨界區在回圈后結束。它不包括
b[i]. 但是, 的計算i 1取決于結果i
如何解決這個問題:我認為你不能。代碼似乎無法以任何有意義的方式并行化,因為每次迭代都取決于最后一次的結果。
uj5u.com熱心網友回復:
對不起,我在現實中確實有。隨著臨界擴展到包括 b[i] 的計算,我得到了同樣的錯誤結果。我猜你是對的,不可paralizable,我只是希望會有一些技巧!
#pragma omp parallel for
for(int i = 0; i < n; i )
{
double v = 0;
#pragma omp critical
{
for (int j=i-1; j <= i 1; j )
if (j >= 0 && j < n)
v = b[j];
b[i] = somecalculation(v);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/388195.html
