线程中的OpenMP阻塞调用

时间:2017-02-20 23:48:41

标签: c parallel-processing openmp blocking

我已经在使用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 个答案:

答案 0 :(得分:1)

这不是关于OpenMP的问题,或者当然不是关于标准的问题。通常,OpenMP实现不太可能意识到执行blockingReceive()的线程已被阻塞,因为它无法轻易发现它可以在编译时阻塞,并且无法在运行时看到它,除非它拦截所有系统调用。

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

相关问题