【问题标题】:Parallelizing using openmp with 4 for loops使用带有 4 个 for 循环的 openmp 进行并行化
【发布时间】:2012-03-20 23:37:18
【问题描述】:

我正在尝试使用 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);
                }
            }
        }
    }

【问题讨论】:

  • 你的算法的输出是什么? o、i、r 和 c 是循环的本地变量,b、m、t 似乎也是临时变量。某处肯定有一些副作用,否则我看不出这样的算法如何产生有用的东西......
  • “据我所知,以下部分无法并行化”:为什么?而 interpolateExtremum() 是做什么的,它会影响下一次循环迭代吗?

标签: c++ multithreading openmp


【解决方案1】:

让我们在这里看看:r 和 c 是循环内的局部变量。 t、m 和 b 似乎是内部循环的只读共享状态。如果isExtremum 和interpolateExtremum 是纯函数(它们不会产生副作用),那么您可以安全地在内循环上添加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);
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多