Это ответ, который я отправил на этот вопрос, прежде чем я понял, что это дубликат этого. Поскольку это как-то расширяет ответы, которые уже даны здесь, я отвечаю им.
parallel for
- это комбинированная директива. Он объединяет parallel
и for
в одной директиве, что позволяет сэкономить немного места.
#pragma omp parallel for shared(sum) private(i,j,k)
...
- это, по сути, сокращенная запись для
#pragma omp parallel shared(sum) private(i,j,k)
{
#pragma omp for
...
}
(предложение private
также можно отнести к директиве for
)
Поскольку синтаксис директивы for
требует, чтобы за ней немедленно следовал с петлей for
, такое же требование синтаксиса применяется к директиве parallel for
. Другими словами, ...
выше может быть только for
-циклом со связанным с ним (блоком) телом:
#pragma omp parallel for ...
for (...)
{
...
}
Наличие for
-петля внутри блока ошибочно. Имея всю параллельную область внутри блока, это не так. Ниже приведен совершенно правильный синтаксис:
{
#pragma omp parallel for ...
for (...)
{
...
}
}