c++ - 依赖嵌套循环的并行化
问题描述
我的目标是在 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 的事实有关,但我不知道如何克服那个问题
解决方案
问题是在更新S[i]
和S[j]
. 不同的线程可能同时读取/写入数组的同一元素,因此它应该是一个原子操作(您必须添加#pragma omp atomic
)以避免数据竞争并确保内存一致性:
for (int j = 0; j < i; ++j)
{
double K = Coordinate[i] - Coordinate[j];
#pragma omp atomic
S[i] += K*Weight[j];
#pragma omp atomic
S[j] -= K*Weight[i];
}
推荐阅读
- abap - 在不使用 TABLES 关键字的情况下修改输入字段上的文本
- javascript - 如何用按钮一个一个地用jQuery遍历一个数组
- docker - Odoo 13 CE 无法预览导入
- pandas - Pandas 数据透视表或 groupby 列的绝对最大值
- css - 使用adaptiveHeight时React.js动画幻灯片高度
- javascript - 在视口中时的 Angular 9 动画
- javascript - 如何使用 sqlite 在 javascript 中创建 if 语句
- python - 在 Pycharm 中无法识别为 Python 文件的 views.py 文件
- python - 在 DOCPLEX 中添加多个二次约束
- scipy - ModuleNotFoundError: No module named 'scipy.version', pip install scipy 和 pip3 install scipy 成功,但错误依旧