c++ - 双循环的 OPENMP 并行问题错误
问题描述
尝试运行时出现错误:“free():损坏的未排序块”:
#pragma omp parallel for reduction(+:save) shared(save2)
for (size_t i = 0; i <= N; ++i) {
vector<float> dist = cdist(i, arestas);
vector<float> distinv(dist.size());
for (size_t j = 0; j < N(); ++j) {
if (arr[j] > 0)
arrv[j] = (1/N) + (1 / arr[j]);
else
arrv[j] = 0;
}
save = accumulate(arrv.begin(), arrv.end(), 0.0);
vector<double>::iterator iter = save2.begin() + i;
save2.insert(iter, sum);
}
解决方案
我可能会错过这里的重点,但是以这种方式(未经测试)怎么办?
vector<double> sum2(N);
#pragma omp parallel for num_threads(8)
for ( size_t i = 0; i < N; i++ ) {
double sum = 0;
for ( size_t j = 0; j < dist.size(); ++j ) {
if ( dist[j] > 0 ) {
sum += 1. / dist[j];
}
}
sum2[i] = sum;
}
这个版本还有一些改进的空间(if
例如通过删除语句,以帮助矢量化),但除非你的代码中有一些无法解释的约束,否则我认为这个版本是一个很好的起点。
推荐阅读
- typescript - 如何扩展另一个模块声明文件?
- database-migration - migrating from [Trac 1.0] to [Trac 1.4] TracError: OperationalError: no such column: description
- ios - 如何使用 CGAffineTransform 使两个视图具有相同的宽度和高度
- python - pymc3中的转换率
- javascript - 我可以在一个函数中堆叠不同的 javascript 方法吗?
- python - 3D 曲面图:如何反转轴
- android - Android Studio“底部导航活动”模板在顶部留下空白区域
- javascript - 在 Vue 中观察异步外部 DOM 变化
- powershell - 提取 xml 标记时将文件名附加到输出
- javascript - 将 Json 数据传递给 HTML