Распараллеливание с использованием openmp с 4 для циклов - PullRequest
0 голосов
/ 21 марта 2012

Я пытаюсь распараллелить мой код, используя openmp.Мне удалось распараллелить большую часть моего кода, кроме одной части.Насколько мне известно, следующую часть нельзя распараллелить, но я подумал о том, чтобы иметь другое мнение.Мы ценим любые предложения.Если это возможно, внутренняя 2 для петель может быть распараллелена, это будет здорово.

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 Ответ

1 голос
/ 25 марта 2012

Хорошо, давайте посмотрим здесь: 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);
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...