Как 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 с индексом цикла я его внутренний цикл будет выполняться последовательно в одном потоке, что очень важно).
Ответы
Ответ 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 только параллелизует цикл рядом с прагмой. Вы можете распараллелить внутренний цикл, если хотите, но это не будет сделано автоматически.