2017-02-20 169 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()的线程已被阻塞,因为它无法轻易发现它可以在编译时被阻塞,并且在运行时无法看到它,除非它拦截所有系统调用。

相反,这是一个关于当线程数量超过逻辑CPU数量(超额订阅)时操作系统如何调度线程的问题。如果我们假设您的blockingReceive()变成阻塞read()系统调用,那么操作系统知道线程处于空闲状态,并且应该将另一个线程安排到该逻辑CPU上,这正是您想要的。

+0

我想我现在明白了,在阅读OpenMP任务时我很困惑,因为他们特意声明对计划程序事件做出反应,我认为其他构造函数可能不会。但它看起来像任务使用另一个建立在OS之上的调度器。这看起来正确吗? – jayjay

+1

是的,或多或少。 OpenMP任务是将工作分配到OpenMP控制的线程的一种方式,因此可以迁移到OpenMP线程,否则OpenMP线程不会执行OpenMP工作(通常是在某种障碍处等待的线程)。这一切都没有比逻辑CPU更多的OpenMP线程,并且没有与操作系统调度程序进行任何交互。 –