2016-11-08 54 views
0

我試圖縮放圖像,通過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實現的問題。任何幫助表示讚賞!

+0

在您的'parallel'指令中添加'private(arr,l,k)' – Gilles

回答

0

您對所有線程使用相同的arr數組。要麼使用單獨的數組(在部分中聲明),要麼重做線程以在外部for循環中運行線程,而不是內部循環。

如果您的圖像按照通常的方式佈置,那麼您的性能會更好,因爲y循環作爲外部循環(因爲這樣可以更好地利用內存緩存)。

+0

對每個部分使用單獨的'arr'數組並不能解決問題,我想是因爲它可以在完成所有這些之前到達'tmp_color' 。有什麼辦法可以解決這個依賴關係嗎?感謝你的回答! @ 1201ProgramAlarm – Zarauztarra