【发布时间】:2019-01-15 03:28:09
【问题描述】:
我一直在研究量子模拟。每个时间步计算一个势函数,迭代求解器的一个步骤,然后进行一系列测量。这三个过程很容易并行化,我已经确保它们不会相互干扰。此外,还有一些相当简单的东西,但不应该并行完成。设置概要如下所示。
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();
}
}
}
代码运行良好!我看到速度增加,主要与 TDSE 求解器一起运行的测量相关(速度增加约 30%)。但是,该程序从使用大约 10% 的 CPU(大约一个线程)到 35%(大约三个线程)。如果势函数、TDSE 迭代器和测量花费相同的时间,这将是有意义的,但事实并非如此。根据速度的提高,我预计 CPU 使用率大约为 15%。
我感觉这与在 while 循环中运行这三个线程的开销有关。更换
#pragma omp sections
与
#pragma omp parallel sections
(并在循环之前省略两行)没有任何改变。有没有更有效的方法来运行这个设置?我不确定线程是否不断被重新创建,或者线程是否在等待其他线程完成时占用了整个核心。如果我将线程数从 3 增加到任何其他数量,程序会使用尽可能多的资源(可能是所有 CPU)并且不会获得性能提升。
【问题讨论】:
-
OpenMP 有时会无缘无故地让线程旋转。但是,我不完全知道是什么原因造成的。鉴于您只是尝试并行运行 3 个函数,您可以尝试使用 STL,我认为像
std::async这样的东西可以工作。您甚至可以通过给它们一个返回值并将其绑定到std::future对象来让您的主线程等待 3 完成。 -
我认为单个语句存在障碍,因此其他线程应该休眠。我也会调查
OMP_WAIT_POLICYstackoverflow.com/a/12617270/2542702 -
也许这是部分的问题,并且可能是使用任务的原因。您是否尝试过使用任务而不是部分?在 OpenMP 3.0 中添加任务之前,部分对我来说似乎是旧的做事方式。
-
您可以尝试
#pragma omp sections nowait,如果需要,可以添加#pragma omp barrier。
标签: c++ multithreading openmp sections