对于openMP来说,有什么建议可以将以下代码与openMP并行
new to openMP, any suggestions to parallel the following code with openMP?
openMP新手,有没有建议将以下代码与openMP并行?
我想用openMP加快代码的速度,并尝试在"sum-=a[I][k]*a[k][j]"的以下两个部分中添加#pragma omp-for,因为热点分析显示这两个循环需要大量时间。但似乎某些比赛条件导致了错误的结果。有什么建议吗?
void ludcmp(float **a, int n, int *indx, float *d)
{
int i,imax,j,k;
float big,dum,sum,temp;
float *vv;
vv=vector(1,n);
*d=1.0;
for (j=1;j<=n;j++) {
for (i=1;i<j;i++) {
sum=a[i][j];
for (k=1;k<i;k++) sum -= a[i][k]*a[k][j]; //here
a[i][j]=sum;
}
big=0.0;
for (i=j;i<=n;i++) {
sum=a[i][j];
for (k=1;k<j;k++)
sum -= a[i][k]*a[k][j]; //here
a[i][j]=sum;
if ( (dum=vv[i]*fabs(sum)) >= big) {
big=dum;
imax=i;
}
}
}
您的变量都是在函数的顶部声明的,因此每个线程都会共享它们,从而导致线程化带来的好处很少或根本没有。
您应该声明尽可能靠近您使用它们的地方的变量。特别是,sum
和k
用于最内部的循环,并且应该在那里声明(这样每个线程都将拥有这些变量的自己的副本(。这也可以扩展到i
和dum
。此外,最后一个if(寻找最大值(可以/应该放在一个单独的循环中,并运行单线程,或者使用适当的OpenMP指令来处理big
和imax
。
相关文章:
- OpenMP:并行更新数组总是需要减少数组吗
- 如何使用OpenMP并行这两个循环
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 如何使用 OpenMP 并行化最近邻搜索
- OpenMP并行发送哪些元素
- 对于openMP来说,有什么建议可以将以下代码与openMP并行
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- std::lock_guard 在 OpenMP 并行中
- 使用与 openmp C++并行的循环计算矩阵中每一行的最小值
- 嵌套循环 OpenMP 并行化、私有索引还是公共索引?
- C++ openmp 并行计算计算错误的结果
- 在 C++ 中使用 OpenMP 并行化两个 for 循环不会提供更好的性能
- 我可以将映射迭代器与 OpenMP 并行使用吗?
- OpenMP C++:并行化 for 循环的负载不平衡
- Qimage setPixel with openmp 并行 for 不起作用
- 如何加快有序子句的 openmp 并行速度?
- 跨越多个函数/对象的OpenMP并行区域
- 使用 OpenMP 并行执行比串行执行 c++ 花费更长的时间,我计算执行时间是否正确?
- 尝试与 OpenMP 并行处理链表数据