【发布时间】: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