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