考虑以下示例,其中各个作业是独立的(线程之间不需要同步):
#pragma omp parallel num_threads(N)
{
#pragma omp for schedule(dynamic) nowait
for (int i = 0; i < jobs; ++i)
{
...
}
}
如果N = 4
和jobs = 3
我怀疑创建和销毁额外线程会有很大的性能损失,但如果N = 32
那么我对此感到疑惑创建/销毁未使用的线程的影响。这是我们应该担心的事情吗?
答案 0 :(得分:2)
首先,表达代码的最常用方法是:
#pragma omp parallel for schedule(dynamic)
for (int i = 0; i < jobs; ++i)
{
}
假设实施具有良好的默认值。
在继续之前,请先测量一下。当然有时可能需要帮助实施,但不要盲目地这样做。大多数其他内容都依赖于实现,因此查看标准对您没有多大帮助。
如果你仍然手动指定线程数,你也可以给它std::max(N, jobs)
。
以下是一些可能影响您案例表现的事项:
OMP_WAIT_POLICY
在您的情况下很重要,因为它定义了等待线程的行为方式。在您的情况下,多余的线程将在并行区域末尾的隐式屏障处等待。实现可以通过设置自由地执行他们想要的操作,但是您可以假设使用active
,线程使用某种形式的忙等待和passive
,线程将会休眠。繁忙的等待线程可以使用计算线程的资源,例如,可用于增加计算线程的turbo频率的功率预算。他们也浪费能源。在超额认购的情况下,活动线程的影响要差得多。