首页 > 解决方案 > 3D 体积阵列的 OpenMP 嵌套循环竞争条件

问题描述

我有一个混合程序,它必须对 3D 阵列进行一些处理,描绘一个体积。每个核心选择自己的卷 (MPI) 部分,然后使用 OpenMP 进行多线程处理。但是,当我使用 pragma 行时,似乎存在竞争条件,并且并未处理卷的所有部分。所以假设我有一个由 0 组成的体积矩阵,函数是每个单元格加 5,我会发现有一半的单元格是空的,并且没有被处理。下面是大部分代码。如果我不包含 pragma 行,它会完美运行,这让我感到困惑。有任何想法吗?

for(z=start;z<=end;z++){
    offset=sizeof(int)*(z*r*c);
    fseek(fpIn,offset,SEEK_SET);
    fread(tempbuffer,sizeof(int),r*c,fpIn);

    #pragma omp parallel for collapse(2) private(x,y,z) schedule(static)
    for(y=0;y<c;y++){
        for(x=0;x<r;x++){
            if(z>=z0 && z<z1 && y>=y0 && y<y1 && x>=x0 && x<x1){
                volbuffer[y*c+x] = proc(tempbuffer[y*c+x]);
            }
            else{
                volbuffer[y*c+x] = tempbuffer[y*c+x]
            }
        }
    }
    fseek(fpOut,offset,SEEK_SET);
    fwrite(volbuffer,sizeof(int),r*c,fpOut);
}

标签: cmultithreadingmultiprocessingmpiopenmp

解决方案


推荐阅读