并行化没有达到预期的效果

时间:2016-11-08 14:41:07

标签: c++ parallel-processing openmp

我试图缩放图像,通过OpenMP进行优化。为了做到这一点,我使用了双三次插值,因此必须对每种颜色的RGB进行,我决定在一个部分中做每种颜色都是一个好主意:

CImg<unsigned char> img // JPG Image of 254x254
int zFactor //Zoom factor, in this case using 4
unsigned char arr[4][4];
unsigned char color[3];
unsigned char tmp_color0, tmp_color1, tmp_color2;
for(i=0; i<z_img.width(); i++) {
    for(j=0; j<z_img.height(); j++) {
        //For R,G,B
        #pragma omp parallel sections
        {
                #pragma omp section
                {
                    for(l=0; l<4; l++){
                        for(k=0; k<4; k++){

                            arr[l][k] = img(i/zFactor +l, j/zFactor +k, 0, 0); // img (x,y,z,c)
                        }
                    }
                    tmp_color0   = bicubicInterpolate_paralelo(arr, (unsigned char)(i%zFactor)/zFactor, (unsigned char)(j%zFactor)/zFactor);
                }
                #pragma omp section
                {
                    for(l=0; l<4; l++){
                        for(k=0; k<4; k++){

                            arr[l][k] = img(i/zFactor +l, j/zFactor +k, 0, 1); // img (x,y,z,c)
                        }
                    }
                    tmp_color1   = bicubicInterpolate_paralelo(arr, (unsigned char)(i%zFactor)/zFactor, (unsigned char)(j%zFactor)/zFactor);
                }
                #pragma omp section
                {
                    for(l=0; l<4; l++){
                        for(k=0; k<4; k++){

                            arr[l][k] = img(i/zFactor +l, j/zFactor +k, 0, 2); // img (x,y,z,c)
                        }
                    }
                    tmp_color2   = bicubicInterpolate_paralelo(arr, (unsigned char)(i%zFactor)/zFactor, (unsigned char)(j%zFactor)/zFactor);
                }
        }
        color[0]=tmp_color0;
        color[1]=tmp_color1;
        color[2]=tmp_color2;
        z_img.draw_point(i,j,color);
    }
}

其中bicubicInterpolate_paralelo是计算像素的双三次插值的函数。运行此代码,我获得以下结果: Xiaomi_logo_zoomed

很明显,我忽略了颜色与时间颜色变量的依赖关系,但我怎么能解决它?如果不使用OpenMP,它就能完美运行,因此它是OpenMP实现的问题。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

您为所有线程使用相同的y数组。要么使用单独的数组(在部分中声明),要么重做线程以在外部for循环上运行线程而不是内部线程。

如果您的图像以通常的方式布局,那么将{{1}}循环作为外部循环会更好(因为这会更好地利用内存缓存)。