for (OpenMP)
Вызывает завершивший работу в цикл for, в параллельной области, разбиваемый между потоками.
#pragma omp [parallel] for [clauses]
for_statement
Заметки
Здесь:
clause (необязательный параметр)
Ноль или несколько предложений. Эти раздел " примечания " список предложений, поддерживаемых by для.for_statement
Цикл for. Неопределенная функциональности если код пользователя в цикле for изменяет переменную индекса.
Заметки
для директива поддерживает следующие предложений OpenMP.
If Параллельно определяет также, clause может быть любым предложением выполнения Параллельно OR для директивы, кроме nowait.
Дополнительные сведения см. в разделе 2.4.1 для конструирования.
Пример
// omp_for.cpp
// compile with: /openmp
#include <stdio.h>
#include <math.h>
#include <omp.h>
#define NUM_THREADS 4
#define NUM_START 1
#define NUM_END 10
int main() {
int i, nRet = 0, nSum = 0, nStart = NUM_START, nEnd = NUM_END;
int nThreads = 0, nTmp = nStart + nEnd;
unsigned uTmp = (unsigned((abs(nStart - nEnd) + 1)) *
unsigned(abs(nTmp))) / 2;
int nSumCalc = uTmp;
if (nTmp < 0)
nSumCalc = -nSumCalc;
omp_set_num_threads(NUM_THREADS);
#pragma omp parallel default(none) private(i) shared(nSum, nThreads, nStart, nEnd)
{
#pragma omp master
nThreads = omp_get_num_threads();
#pragma omp for
for (i=nStart; i<=nEnd; ++i) {
#pragma omp atomic
nSum += i;
}
}
if (nThreads == NUM_THREADS) {
printf_s("%d OpenMP threads were used.\n", NUM_THREADS);
nRet = 0;
}
else {
printf_s("Expected %d OpenMP threads, but %d were used.\n",
NUM_THREADS, nThreads);
nRet = 1;
}
if (nSum != nSumCalc) {
printf_s("The sum of %d through %d should be %d, "
"but %d was reported!\n",
NUM_START, NUM_END, nSumCalc, nSum);
nRet = 1;
}
else
printf_s("The sum of %d through %d is %d\n",
NUM_START, NUM_END, nSum);
}