Я уже использую OpenMP для некоторой параллельной обработки и хотел бы добавить поток управления с блокирующим приемом. Большую часть времени этот поток будет заблокирован, и поэтому я не хочу, чтобы он сидел там, занимая ядро. В идеале блокирующий вызов вызовет доходность дополнительного рабочего потока. Как OpenMP справится с блокирующим вызовом?Открытый вызов блокировки OpenMP в потоке
Что-то вроде этого:
#include <omp.h>
int main()
{
int cores = omp_get_num_procs();
#pragma omp parallel num_threads(cores + 1)
if (omp_get_thread_num() == 0) {
send();
blockingReceive();
}
else
{
work();
}
}
Я думаю, что сейчас понимаю, я был смущен, когда читал о задачах OpenMP, поскольку они были заявлены специально для реагирования на события планировщика. Я думал, что другие конструкции не могут. Но похоже, что задачи используют другой планировщик, построенный поверх ОС. Кажется ли это правильным? – jayjay
Да, более или менее. Задачи OpenMP - это способ распространения работы на потоки, которые контролируются OpenMP, поэтому они могут мигрировать в потоки OpenMP, которые в противном случае не выполняли бы работу OpenMP (обычно это потоки, которые ждут какого-то барьера). Это происходит, не имея больше потоков OpenMP, чем логические процессоры, и без какого-либо взаимодействия с планировщиком операционной системы. –