我试图缩放图像,通过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实现的问题。任何帮助表示赞赏!
答案 0 :(得分:0)
您为所有线程使用相同的y
数组。要么使用单独的数组(在部分中声明),要么重做线程以在外部for循环上运行线程而不是内部线程。
如果您的图像以通常的方式布局,那么将{{1}}循环作为外部循环会更好(因为这会更好地利用内存缓存)。