繁体   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