簡體   English   中英

如何保證與OpenMP的數據同步?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM