Создание темы OpenMP

В приведенном ниже коде будет ли среда выполнения OpenMP повторно создавать потоки или повторно использовать созданные ранее потоки — то есть использовать пул потоков?

Некоторые коллеги утверждали, что это создаст потоки заново, потому что предложение «#parallel» вложено в for; Я сомневался в этом и сделал несколько тестов на GDB, которые показывают, что это не так. Темы фактически используются повторно.

#include <cstdio>
#include <omp.h>
#include <unistd.h>

void fun1() {
for (int j=1; j<=5; j++) {
#pragma omp parallel for
for (int i=1; i<=5; i++) {
printf("Hahaha %d -> %d\n", omp_get_thread_num(), i);
}
}
}

void fun2() {
for (int j=1; j<=5; j++) {
#pragma omp parallel for
for (int i=1; i<=5; i++) {
printf("Hahaha %d -> %d\n", omp_get_thread_num(), i);
}
}
}

int main() {

fun1();

sleep(1);

fun2();

return 0;
}

1

Решение

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

тем не мение

  1. Стандарт имеет правила о постоянстве локального хранилища потоков, которые означают, что пул потоков является самым простым способом достижения требуемой семантики.
  2. Люди, которые пишут реализации OpenMP, не являются идиотами, поэтому используйте реализации, которые являются максимально быстрыми (и, следовательно, используют пулы потоков).

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

Что касается проверки этого утверждения, посмотрите на код для OpenMP среды выполнения OpenMP, такой как LLVM (это также среда выполнения, используемая компиляторами Intel) и GCC gomp.

постскриптум Использование пулов потоков не имеет ничего общего с использованием каких-либо конкретных интерфейсов OpenMP, хотя, конечно, если вы форсируете увеличение числа потоков, придется создавать новые потоки в дополнение к уже существующим.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]