使用OpenMP并行化的方法?

时间:2013-11-22 04:59:14

标签: openmp

有人能建议使用openmp并行化这种方法吗?运行此代码时,程序将中止。

void grayerode(int **img, int height, int width, int filterheight,
            int filterwidth, int iterations, int pixrange) 
    {

      int maxlabel=0;
      int fh, fw, iters, pixval=0, i, j, s, k;
      int fhlimit = filterheight/2;
      int fwlimit = filterwidth/2;
      int **smoothedlabels;

      allocate_2D_int_matrix ( &smoothedlabels, height, width );

     #pragma omp parallel for shared(smoothedlabels,height,width,k) 

    for (i=0; i<height; i++)
        for (j=0; j<width; j++)
          smoothedlabels[i][j] = img[i][j];

      int *labeltemp = (int *)malloc(pixrange*sizeof(int));
      for (s=0; s<pixrange; s++)
        labeltemp[s] = 0;

      for (iters=0; iters<iterations; iters++) {
      #pragma omp parallel for private(i,j,labeltemp)
        for (i=fhlimit; i<height-fhlimit; i++) {
          for (j=fwlimit; j<width-fwlimit; j++) {

        for (fh=-fhlimit; fh<=fhlimit; fh++)
          for (fw=-fwlimit; fw<=fwlimit; fw++) {
            labeltemp[img[i+fh][j+fw]]++;
          }

        for (s=0; s<pixrange; s++) {
          if (labeltemp[s]>maxlabel) {
            maxlabel = labeltemp[s];
            pixval = s;
          }
        }

        smoothedlabels[i][j]=pixval;

        for (s=0; s<pixrange; s++)
          labeltemp[s] = 0;
        maxlabel = 0;
          }
        }
      }  
        for (i=0; i<height; i++)
          for (j=0; j<width; j++)
        img[i][j] = smoothedlabels[i][j];



      free_2D_int_matrix ( &smoothedlabels );
      free(labeltemp);
      return;
    }

1 个答案:

答案 0 :(得分:0)

一些事情:

您没有正确声明私有变量。在您的代码中以正确的方式执行此操作的一个示例:

#pragma omp parallel for private(i,j) shared(smoothedlabels, img, width, height)
for(i=0; i<height; i++)
  for(j=0; j<width; j++)
     smoothedlabels[i][j] = img[i][j]

重要的是j保持私有或每个线程都会尝试更改其值 - 给您意想不到的行为。 (注意:当你声明pragma语句时,我实际上隐式声明为私有,但我总是更愿意明确说明它以提高可读性

尝试避免使用2D数组,因为它们限制了您的并行化能力。在同一示例中,您可以执行以下操作:

#pragma omp parallel for private(i) shared(width, height, smoothedlabels, img)
for(i=0; i<width * height; i++)
    smoothedlabels[i] = img[i]

这将为您整个循环并行化,而不仅仅是外循环。您可以按列或按行顺序订购1D阵列。

其余的循环也是如此 - 只需应用相同的概念。

稍后在您的代码中,您有以下内容:

for (fh=-fhlimit; fh<=fhlimit; fh++)
  for (fw=-fwlimit; fw<=fwlimit; fw++) {
      labeltemp[img[i+fh][j+fw]]++;
  }

如果你没有声明fh和fw私有,那么你会得到意想不到的行为,出于同样的原因,在没有声明j之前会给你意想不到的行为。