Как выполняется непараллельный цикл for внутри параллельного раздела OpenMP?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как выполняется непараллельный цикл for внутри параллельного раздела OpenMP?

Сообщение Anonymous »

Рассмотрим следующий код:

Код: Выделить всё

#pragma omp parallel
for (int run = 0; run < 10; run++)
{
std::vector out;
#pragma omp for
for (int i = 0; i < 1'000'000; i++)
{
...
}
}
Намерение состоит в том, чтобы создать потоки OpenMP только один раз* перед внешними итерациями, которые должны выполняться последовательно, а затем запланировать внутренние итерации несколько раз в одних и тех же существующих параллельных потоках.
Однако внешняя итерация не помечена #pragma omp single, и поэтому я предполагаю, что она будет выполнять что-то вроде запуска одного и того же внешнего кода во всех потоках одновременно, что может а) одновременно изменять переменную run в неподходящее время и б) конфликтовать при создании экземпляра out.
Как это будет выполняться на практике? Есть ли способ добиться того, чего я хочу, с помощью OpenMP или попросить OpenMP повторно использовать пул потоков в MSVC, или OpenMP является неправильным подходом для этого?
* MSVC, по крайней мере, в последних версиях (17.14.20), похоже, не гарантирует повторное использование потоков из пула потоков? Мой фактический код немного сложнее этого; на практике я намерен поместить внутренний цикл for в потерянную функцию, которая будет вызываться внешней функцией, которая отвечает за настройку параллельного выполнения.

Подробнее здесь: https://stackoverflow.com/questions/798 ... n-executed
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»