В приведенном ниже коде будет ли среда выполнения 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;
}
Стандарт OpenMP описывает семантику, требуемую для реализации, а не то, как она достигается, поэтому в стандарте ничего не говорится об использовании пулов потоков.
тем не мение
Поэтому, хотя вы не можете гарантировать, что пул потоков используется, вы можете разумно ожидать, что это так.
Что касается проверки этого утверждения, посмотрите на код для OpenMP среды выполнения OpenMP, такой как LLVM (это также среда выполнения, используемая компиляторами Intel) и GCC gomp.
постскриптум Использование пулов потоков не имеет ничего общего с использованием каких-либо конкретных интерфейсов OpenMP, хотя, конечно, если вы форсируете увеличение числа потоков, придется создавать новые потоки в дополнение к уже существующим.
Других решений пока нет …