Подтвердить что ты не робот

Как OpenMP обрабатывает вложенные циклы?

Содержит ли следующий код только первые (внешние) циклы или распараллеливает все вложенные циклы?

    #pragma omp parallel for
    for (int i=0;i<N;i++)
    { 
      for (int j=0;j<M;j++)
      {
       //do task(i,j)//
      }
    }

Я просто хочу убедиться, что вышеприведенный код будет распараллелить все вложенные for-loops (таким образом, один поток напрямую связан с задачей (i, j)) или он только распараллеливает внешний цикл for (таким образом, он гарантирует, для каждой нити parrallel с индексом цикла я его внутренний цикл будет выполняться последовательно в одном потоке, что очень важно).

4b9b3361

Ответ 1

Строки, которые вы написали, будут распараллеливать только внешний цикл. Для распараллеливания вам нужно добавить предложение collapse:

#pragma omp parallel for collapse(2)
    for (int i=0;i<N;i++)
    { 
      for (int j=0;j<M;j++)
      {
       //do task(i,j)//
      }
    }

Для более подробной информации вы можете проверить спецификации OpenMP 3.1 (сек. 2.5.1).

Ответ 2

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