RyG*_*nCA 12 c++ multithreading openmp
请考虑以下示例,其中各个作业是独立的(线程之间不需要同步):
#pragma omp parallel num_threads(N)
{
#pragma omp for schedule(dynamic) nowait
for (int i = 0; i < jobs; ++i)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
如果N = 4和jobs = 3我怀疑会有太大的性能损失,以具有额外的线程创建和销毁,但如果N = 32当时我不知道有关创建/销毁未使用的线程的影响.这是我们应该担心的吗?
首先,表达代码的最通用的方式是:
#pragma omp parallel for schedule(dynamic)
for (int i = 0; i < jobs; ++i)
{
}
Run Code Online (Sandbox Code Playgroud)
假设实现有一个良好的默认值。
在继续之前,先进行测量。当然,有时可能有必要帮助实施,但不要盲目这样做。大多数其他事情都依赖于实现,因此查看标准对您没有多大帮助。
如果你还是手动指定线程数,不妨给它std::max(N, jobs)。
以下是一些可能影响您案例性能的注意事项:
OMP_WAIT_POLICY您的情况很重要,因为它定义了等待线程的行为方式。在您的情况下,多余的线程将在并行区域末尾的隐式屏障处等待。实现可以自由地对设置进行所需的操作,但您可能会假设active线程使用某种形式的忙等待passive,并且线程将休眠。繁忙的等待线程可以使用计算线程的资源,例如可以用于增加计算线程的涡轮频率的功率预算。他们还浪费能源。在超额订阅的情况下,活动线程的影响会更严重。