繁体   English   中英

拥有更多OpenMP线程比工作对性能有何影响?

[英]What is the performance impact of having more OpenMP threads than work?

请考虑以下示例,其中各个作业是独立的(线程之间不需要同步):

#pragma omp parallel num_threads(N)
{
    #pragma omp for schedule(dynamic) nowait
    for (int i = 0; i < jobs; ++i)
    {
        ...
    }
}

如果N = 4jobs = 3我怀疑创建和销毁额外线程会有很多性能损失,但如果N = 32那么我想知道创建/销毁未使用线程的影响。 这是我们应该担心的吗?

首先,表达代码的最常用方法是:

#pragma omp parallel for schedule(dynamic)
for (int i = 0; i < jobs; ++i)
{
}

假设实现具有良好的默认值。

在进一步研究之前,请先测量一下。 当然有时可能需要帮助实施,但不要盲目地这样做。 大多数进一步的东西都是依赖于实现的,所以查看标准对你没什么帮助。

如果你仍然手动指定线程数,你也可以给它std::max(N, jobs)

以下是一些可能会影响您案例表现的事情:

  • 不要过分担心产生不必要的线程的开销。 实现通过线程池来缓解这种情况。 这并不意味着它总是完美的 - 所以衡量。
  • 除非您知道自己在做什么,否则不要超额订阅。 使用最多数量的核心线程。 这是一般性建议。
  • OMP_WAIT_POLICY在您的情况下很重要,因为它定义了等待线程的行为方式。 在您的情况下,多余的线程将在并行区域末尾的隐式屏障处等待。 实现可以通过设置自由地执行他们想要的操作,但是您可以假设在active ,线程使用某种形式的忙等待和passive ,线程将会休眠。 繁忙的等待线程可以使用计算线程的资源,例如可以用于增加计算线程的turbo频率的功率预算。 他们也浪费能源。 在超额预订的情况下,活动线程的影响要严重得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM