【发布时间】:2021-07-30 02:32:15
【问题描述】:
我的目标是在 C++ 上计算一个简单的 N 体程序,并且我正在使用 OpenMP 来加快计算速度。在某些时候,我的嵌套循环看起来像这样:
int N;
double* S = new double[N];
double* Weight = new double[N];
double* Coordinate = new double[N];
...
#pragma omp parallel for
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < i; ++j)
{
double K = Coordinate[i] - Coordinate[j];
S[i] += K*Weight[j];
S[j] -= K*Weight[i];
}
}
这里的问题是我在删除#pragma 时没有得到完全相同的结果......我猜这与第二个循环依赖于整数 i 的事实有关,但我不看看如何解决这个问题
【问题讨论】:
-
如果您使用
collapse子句,则依赖内循环只会在正确结果方面成为问题。但是,如果 OpenMP 默认使用static调度,它可能会影响性能,因为不同的线程可能有非常不同的工作负载。因此,您应该确保使用dynamic调度,例如带有schedule(dynamic)子句。在this question下面有深入的解释。
标签: c++ loops parallel-processing openmp