c - I don't know what is wrong with this loop parallelization
问题描述
I do not know why, but the parallelization of this loop is not working fine:
#pragma omp parallel for private(d)
for ( i = 0 ; i < nt1 ; i++ ) {
d = distancia(tabla1[i],tabla2[j]);
if ( d < dm ) {
#pragma omp critical
if ( d < dm ) {
dm = d;
im = i;
}
}
}
ps[j] = im;
The d
variable is private and the dm
and im
are inside a critical zone but when I exec this code (the full code is bigger, this is just a small part of it) the output changes from the sequential version.
Thanks!
解决方案
我相信问题在于,即使它是一个临界区,在顺序版本中我们总是会得到最低i
值并添加这个条件:(dm == d && i < im)
在条件中我们确保代码仍然以相同的方式工作。我不确定这是否是最好的解决方案,但它非常简单并且对我有用。这是包含更改的完整代码:
for ( j = 0 ; j < nt2 ; j++ ) {
dm = MAX_LON + 1;
#pragma omp parallel for private(d)
for ( i = 0 ; i < nt1 ; i++ ) {
d = distancia(tabla1[i],tabla2[j]);
if ( d < dm || (dm == d && i < im)) {
#pragma omp critical
{
if ( d < dm || (dm == d && i < im)) {
dm = d;
im = i;
}
}
}
}
ps[j] = im;
}
推荐阅读
- python - 如何使用分布列表绘制类标签
- qlikview - 如何修复 qlik sense/qlik 视图“找不到请求的资源。” 尝试导出数据时
- c++ - 这是 c++ 中的合法语法吗?以及如何使用 crtp 技巧?
- flutter - 颤振持续时间选择器包
- laravel-livewire - livewire 在子文件夹的实时服务器上返回响应代码 302
- python - ValueError: 层 lstm_5 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:(无,43264)
- python-3.x - 如何检查一列的字符串,并使用熊猫更改另一列的字符串
- opencv - 使用 YOLO 实时检测具有各种类别的多个对象
- wordpress - AWS EC2 实例中 Git 拉取和 Curl 请求的 Cloudflare 超时问题
- machine-learning - Resnet50 迁移学习与 tensorflow.keras 版本 2.4+