小编Jos*_*a M的帖子

For 循环中的 OpenMP 并行部分 (C++) - 开销

我一直在研究量子模拟。每个时间步计算一个势函数,迭代求解器的一个步骤,然后进行一系列测量。这三个过程很容易并行化,而且我已经确保它们不会相互干扰。此外,还有一些相当简单的东西,但不应该并行完成。设置概要如下所示。

omp_set_num_threads(3);
#pragma omp parallel
{
    while (notDone) {
        #pragma omp sections
        {
            #pragma omp section
            {
                createPotential();
            }
            #pragma omp section
            {
                iterateWaveFunction();
            }
            #pragma omp section
            {
                takeMeasurements();
            }
        }
        #pragma omp single
        {
            doSimpleThings();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

代码工作得很好!我看到速度增加,主要与与 TDSE 求解器一起运行的测量相关(速度增加约 30%)。然而,程序从使用大约 10% 的 CPU(大约一个线程)到 35%(大约三个线程)。如果势函数、TDSE 迭代器和测量花费的时间相同,这将是有意义的,但它们没有。基于速度的提高,我预计 CPU 使用率将达到 15%。

我有一种感觉,这与在 while 循环中运行这三个线程的开销有关。更换

#pragma omp sections
Run Code Online (Sandbox Code Playgroud)

#pragma omp parallel sections
Run Code Online (Sandbox Code Playgroud)

(并在循环之前省略两行)没有任何改变。有没有更有效的方法来运行这个设置?我不确定线程​​是否不断被重新创建,或者线程是否在等待其他线程完成时占用了整个核心。如果我将线程数从 3 增加到任何其他数字,程序将使用它想要的尽可能多的资源(可能是所有 CPU)并且不会获得性能提升。

c++ multithreading openmp sections

5
推荐指数
1
解决办法
775
查看次数

标签 统计

c++ ×1

multithreading ×1

openmp ×1

sections ×1