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();
}
}
我想我现在明白了,在阅读OpenMP任务时我很困惑,因为他们特意声明对计划程序事件做出反应,我认为其他构造函数可能不会。但它看起来像任务使用另一个建立在OS之上的调度器。这看起来正确吗? – jayjay
是的,或多或少。 OpenMP任务是将工作分配到OpenMP控制的线程的一种方式,因此可以迁移到OpenMP线程,否则OpenMP线程不会执行OpenMP工作(通常是在某种障碍处等待的线程)。这一切都没有比逻辑CPU更多的OpenMP线程,并且没有与操作系统调度程序进行任何交互。 –