簡體   English   中英

openmp中的嵌套循環並行

[英]Parallel for nested loops in openmp

我對 OpenMP 中的並行 for 循環代碼有問題,並行 for 循環的結果與順序 for 循環不同。 如何使此代碼與順序代碼具有相同的結果。

const long nx = 20;
const long ny = 20;
const long nz = 20;
int i, j, k, a, v;

#pragma omp parallel private(tid_2, i,j,k,a,v) shared(numt_2,nx,ny,nz)
{
    numt_2 = omp_get_num_threads();
    tid_2 = omp_get_thread_num();
    printf("Thread %d Total thread%d\n", tid_2, numt_2);

#pragma omp parallel for collapse(4) //num_threads(3)
for (i = 0; i <= nx; i++)
{
    for (j = 0; j <= ny; j++)
    {
        for (k = 0; k <= nz; k++)
        {
            for (a = 0; a < 19; a++)
            {
                ff[fineindex(i, j, k, a)] = 0.0;

                //#pragma omp barrier

                for (v = 0; v < 19; v++)
                {          
                    ff[fineindex(i, j, k, a)] += Minv2[a][v] * rf[v];
                }
            }
        }
    }
}
}

您的外部parallel區域將多次執行內部parallel for區域。 假設你的機器上有 8 個核心,循環將被計算 8 次,而順序版本只運行一次循環。

ff在並行區域中的線程之間隱式共享。 因此,在計算過程中, ff[fineindex(i, j, k, a)]可能存在數據競爭。 由於 8 個線程同時在ff上工作,當兩個線程嘗試寫入ff的同一個索引時,可能會導致無法預料的結果。

要解決此問題,您可以使用omp for而不是omp parallel for循環。 omp for僅用於工作共享,它將循環迭代分配給外部並行區域中的線程。 它不會啟動另一個並行區域。 這樣,外部並行中的每個線程將處理不同的循環迭代。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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