使用OpenMP在C ++中并行循环

时间:2016-11-10 22:02:18

标签: c++ for-loop parallel-processing openmp

此并行化返回的解决方案与应该返回的解决方案不匹配,就像非并行化的解决方案一样。

    double angle=(PI/180)*atoi(extra);
    unsigned int xf;
    unsigned int yf;
    int j;    
    #pragma omp parallel for private (j,xf,yf)        
    for(int i=0;i<width;i++){
        for(j=0;j<height;j++){  
            xf=(unsigned int)ceil(((cos(angle)*(j-(((double)height)/2.0)))-(sin(angle)*(i-(((double)width)/2.0))))+(((double)height)/2.0));
            yf=(unsigned int)ceil(((sin(angle)*(j-(((double)height)/2.0)))+(cos(angle)*(i-(((double)width)/2.0))))+(((double)width)/2.0));
            if(xf<(unsigned int)height && xf>=0 && yf>=0 && yf<(unsigned int)width){
                  matrixRed2[yf][xf]=matrixRed[i][j];
                  matrixGreen2[yf][xf]=matrixGreen[i][j];
                  matrixBlue2[yf][xf]=matrixBlue[i][j];
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

我认为j不需要在循环之外,因为它在分配给数组之前只包含临时值(它具有独立的元素)。而且,两个for循环可以折叠。 编辑:每个xf,yf不保证与i,j的公式唯一。所以保持顺序,或者你可以尝试检查以保持最大(i,j),如果在(xf,yf)有竞争条件。 我不确定OpenMP是否可以在Visual Studio上运行,因为支持的版本非常旧(2.0,同时最新的是4.5)。