【问题标题】:OpenMP blocking call in thread线程中的 OpenMP 阻塞调用
【发布时间】:2017-02-20 23:48:40
【问题描述】:

我已经在使用 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();
    }
}

【问题讨论】:

    标签: c parallel-processing openmp blocking


    【解决方案1】:

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

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

    【讨论】:

    • 我想我现在明白了,我在阅读 OpenMP 任务时感到困惑,因为它们专门用于对调度程序事件做出反应,我认为其他构造可能不会。但看起来任务使用另一个构建在操作系统之上的调度程序。这看起来对吗?
    • 是的,或多或少。 OpenMP 任务是一种将工作分配给 OpenMP 控制的线程的方法,因此它们可以迁移到 OpenMP 线程,否则这些线程将无法执行 OpenMP 工作(通常是在某种屏障处等待的线程)。这一切都是在没有比逻辑 CPU 更多的 OpenMP 线程的情况下发生的,也不需要与操作系统调度程序进行任何交互。
    猜你喜欢
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多