使用openmp和4 for for循环并行化

时间:2012-03-20 23:37:18

标签: c++ multithreading openmp

我正在尝试使用openmp并行化我的代码。我设法并行化了大部分代码,除了一部分。根据我的知识,以下部分不能并行化,但我想有不同的意见。任何建议,将不胜感激。如果可能的话,内部2 for循环可以并行化,这将是很好的。

for (o = 0; o < octaves; ++o)
  for ( i = 0; i <= 1; ++i)
    {
      b = responseMap.at(filter_map[o][i]);
      m = responseMap.at(filter_map[o][i+1]);
      t = responseMap.at(filter_map[o][i+2]);

      // loop over middle response layer at density of the most 
      // sparse layer (always top), to find maxima across scale and space

      for ( r = 0; r < t->height; ++r)
        {
          for (c = 0; c < t->width; ++c)
            {
              if (isExtremum(r, c, t, m, b))
                {
                  interpolateExtremum(r, c, t, m, b);
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

我们在这里看到:rc是循环内的局部变量。 tmb似乎是内部循环的只读共享状态。如果isExtremuminterpolateExtremum是纯函数(它们不会产生副作用),那么你可以安全地在内循环上拍一个parallel for

  #pragma omp parallel for private(r, c)
  for ( r = 0; r < t->height; ++r)
    {
      for (c = 0; c < t->width; ++c)
        {
          if (isExtremum(r, c, t, m, b))
            {
              interpolateExtremum(r, c, t, m, b);
            }
        }
    }