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