我已经在使用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();
}
}
答案 0 :(得分:1)
这不是关于OpenMP的问题,或者当然不是关于标准的问题。通常,OpenMP实现不太可能意识到执行blockingReceive()
的线程已被阻塞,因为它无法轻易发现它可以在编译时阻塞,并且无法在运行时看到它,除非它拦截所有系统调用。
相反,这是一个关于当线程多于logicalCPU(超额订阅)时操作系统如何调度线程的问题。如果我们假设您的blockingReceive()
变成了阻塞read()
系统调用,那么操作系统就知道该线程处于空闲状态,并且应该将另一个线程安排到该逻辑CPU上,这就是您想要的。