2017-02-20 7 views
0

Я уже использую 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(); 
    } 
} 

ответ

1

Это не вопрос о OpenMP, или, конечно же, не о стандарте. В целом маловероятно, что реализация OpenMP знает, что поток, выполняющий blockingReceive(), заблокирован, поскольку он не может легко обнаружить, что он может блокироваться во время компиляции и не может видеть его во время выполнения либо, если он не перехватывает всю систему звонки.

Вместо этого, это вопрос о том, как операционная система планирует потоки, когда есть больше потоков, чем логические процессоры (overubscription). Если мы предположим, что ваш blockingReceive() превращается в системный вызов блокировки read(), то ОС знает, что поток простаивает и должен запланировать другой поток на этот логический CPU, который вам и нужен.

+0

Я думаю, что сейчас понимаю, я был смущен, когда читал о задачах OpenMP, поскольку они были заявлены специально для реагирования на события планировщика. Я думал, что другие конструкции не могут. Но похоже, что задачи используют другой планировщик, построенный поверх ОС. Кажется ли это правильным? – jayjay

+1

Да, более или менее. Задачи OpenMP - это способ распространения работы на потоки, которые контролируются OpenMP, поэтому они могут мигрировать в потоки OpenMP, которые в противном случае не выполняли бы работу OpenMP (обычно это потоки, которые ждут какого-то барьера). Это происходит, не имея больше потоков OpenMP, чем логические процессоры, и без какого-либо взаимодействия с планировщиком операционной системы. –

Смежные вопросы