如何将 OpenMP 用于我的代码
how can i use openMP for my code?
我从openMP开始,我想并行化这部分代码
int A[n][m+1];
int B[k][m];
for (h=0;h<100;h++){
for (i=0;i<n;i++){p=0;
for (j=0;j<k;j++){s=0;
for (l=0;l<m;l++){
s+=(A[i][l]-B[j][l]);
}
s=sqrt(s);
if (j==0) min =s;
else
if (min > s){min =s;p=j;}
}
A[i][m]=p;
}
}
这是我使用 openMP 并行化的尝试
#pragma omp parallel for private(s)
for (h=0;h<100;h++){
for (i=0;i<n;i++){p=0;
for (j=0;j<k;j++){s=0;
for (l=0;l<m;l++){
s+=(A[i][l]-B[j][l]);
}
s=sqrt(s);
if (j==0) min =s;
else
if (min > s){min =s;p=j;}
}
A[i][m]=p;
}
}
我怎样才能正确地做到这一点?我需要你的帮助。
您现在缺少几个方面:
私有变量与共享变量:不得让多个线程使用与循环计数器或任何其他类型的辅助变量相同的变量。如果一个线程修改了另一个线程的循环计数器,那么混乱就会随之而来。解决方案:指定哪些变量是共享的,哪些是私有的:
#pragma omp parallel for private(s, min, h, i, j, l) shared(n, k, m)
归约:您正在对变量"min"执行归约操作。从 OpenMP 3.1 和 gcc 4.7 开始,您可以让 OpenMP 为您处理此缩减 (*):
#pragma omp parallel for reduction(min : min) private(s, h, i, j, l) shared(n, k, m)
// here the rest of your code
操作min
(最小值)和min
变量的名称都掩盖了此特定语法段。现在我不确定你是否真的需要更改变量的名称——我假设你不需要——但这仍然是一个好主意。此外,正如您在评论中已经被告知的那样,尽量避免使用字母"l"作为变量名称,因为它看起来像数字 1。
(*) 在早期版本的 OpenMP 中,在 C 语言中,您没有最小/最大缩减,因此您必须在每个线程的私有变量中存储一个临时值min
,然后在循环后、关键部分内或使用原子操作查找全局最小值。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么我的代码在输出中增加了93天
- 0-1背包代码中的错误.我的代码中有什么错误
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 在我的代码中,获得最大的Pair Wise产品C++和输出并不总是正确的
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 我的代码运行良好,但在游戏循环中中断
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 我的代码中的意外价值以及我如何修复它
- 为什么 rand 不在我的代码中生成随机数?
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 如何改进我的代码,使其不会因超时而终止?(黑客排名挑战)
- 无法找出我的代码中的内存泄漏
- 我不明白为什么我的代码不起作用并且需要更长的时间来运行
- 我正在尝试创建一个菜单,但我的代码一直在循环