【问题标题】:Parallelization is not doing what expected并行化没有达到预期的效果
【发布时间】:2016-11-08 14:41:06
【问题描述】:

我正在尝试缩放图像,并通过 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 是一个计算像素双三次插值的函数。运行此代码,我得到以下结果:

很明显,我忽略了颜色与时间颜色变量的依赖关系,但我该如何解决呢?在不使用 OpenMP 的情况下,它可以完美地工作,所以这是 OpenMP 实现的问题。任何帮助表示赞赏!

【问题讨论】:

  • private( arr, l, k ) 添加到您的parallel 指令中

标签: c++ parallel-processing openmp


【解决方案1】:

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

如果您的图像以通常的方式布局,则将y 循环作为外部循环会更好(因为这样可以更好地利用内存缓存)。

【讨论】:

  • 对每个部分使用单独的arr 数组并不能解决问题,我猜是因为它可以在完成所有部分之前到达tmp_color。有没有办法解决这种依赖?感谢你的回答! @1201ProgramAlarm
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 2014-05-06
  • 2016-01-12
相关资源
最近更新 更多