[英]How to ensure data synchronization with OpenMP?
當我嘗試從以下代碼執行數學表達式時,矩陣值不一致,我該如何解決?
#pragma omp parallel num_threads (NUM_THREADS)
{
#pragma omp for
for(int i = 1; i < qtdPassos; i++)
{
#pragma omp critical
matriz[i][0] = matriz[i-1][0]; /
for (int j = 1; j < qtdElementos-1; j++)
{
matriz[i][j] = (matriz[i-1][j-1] + (2 * matriz[i-1][j]) + matriz[i-1][j+1]) / 4; // Xi(t+1) = [Xi-1 ^ (t) + 2 * Xi ^ (t)+ Xi+1 ^ (t)] / 4
}
matriz[i][qtdElementos-1] = matriz[i-1][qtdElementos-1];
}
}
問題來自於循環攜帶依賴性引起的競爭條件。 包含循環不能並行化(也不能並行化內部循環),因為循環迭代matriz
讀取/寫入當前行和上一行。 這同樣適用於列。
請注意,OpenMP 不會檢查循環是否可以並行化(事實上,理論上通常不能)。 您有責任進行檢查。 此外,請注意,在整個迭代中使用臨界區會序列化執行,從而破壞並行循環的目的(事實上,由於臨界區的開銷,它會變慢)。 另請注意, #pragma omp critical
僅適用於下一條語句。 保護行matriz[i][0] = matriz[i-1][0];
不足以避免競爭條件。
我不認為當前代碼可以(有效地)並行化。 也就是說,如果您的目標是實現 1D/2D 模板,那么您可以使用雙緩沖技術(即寫入不同於輸入數組的 2D 數組)。 類似的邏輯可以應用於重復多次的 1D 模板(這顯然是你想要做的)。 請注意,在這種情況下,結果會有所不同。 對於 1D 模板情況,這種雙緩沖策略可以解決依賴性問題並使您能夠並行化內部循環。 對於 2D 模板情況,兩個嵌套循環可以並行化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.