2014-02-07 2 views
1

Я занимаюсь обработкой изображений и имею вложенный цикл. Я хочу реализовать многопроцессорную обработку с использованием OpenMP. Цикл for выглядит так, где я добавил теги прагмы и объявил некоторые из переменных частными.OpenMP: Вложенная петля, практически любая разница во времени выполнения

int a,b,j, idx; 
#pragma omp parallel for private(b,j,sumG,sumGI) 
    for(a = 0; a < ny; ++a) 
    { 
     for(b = 0; b < nx; ++b) 
     { 
      idx = a*ny+b; 
      if (imMask[idx] == 0) 
      { 
       Wshw[idx] = 0; 
       continue; 
      } 

      sumG = 0; 
      sumGI = 0; 

      for(j = a; j < ny; ++j) 
      { 
       sumG += shadowM[j-a]; 
       sumGI += shadowM[j-a] * imBlurred[nx*j + b]; 
      } 

      Wshw[idx] = sumGI/sumG; 
     } 
    } 

Размера как пе и пу велика, и я подумал, что, используя OpenMP, я хотел бы получить снижение спускаемого во время исполнения, а там почти нет разницы. Я что-то делаю неправильно, когда могу реализовать многопоточность?

+0

Вам также нужно сделать 'idx' частным. –

ответ

2

У вас есть гонка в idx. Вы также должны сделать это частным.

Однако вместо этого вы можете попробовать что-то вроде этого.

int a,b,j, idx; 
#pragma omp parallel for private(a,b,j,sumG,sumGI) 
for(idx=0; idx<ny*nx; ++idx) { 
    if (imMask[idx] == 0) 
    { 
     Wshw[idx] = 0; 
     continue; 
    } 

    sumG = 0; 
    sumGI = 0; 
    a=idx/ny; 
    b=idx%ny; 
    for(j = a; j < ny; ++j) { 
     sumG += shadowM[j-a]; 
     sumGI += shadowM[j-a] * imBlurred[nx*j + b]; 
    } 

    Wshw[idx] = sumGI/sumG; 
} 

Возможно, вы можете использовать внутреннюю петлю, а также функцию idx вместо a и b.

Смежные вопросы