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