对于openMP来说,有什么建议可以将以下代码与openMP并行

new to openMP, any suggestions to parallel the following code with openMP?

本文关键字:openMP 并行 代码 来说 什么 对于      更新时间:2023-10-16

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;
}
}
}

您的变量都是在函数的顶部声明的,因此每个线程都会共享它们,从而导致线程化带来的好处很少或根本没有。

您应该声明尽可能靠近您使用它们的地方的变量。特别是,sumk用于最内部的循环,并且应该在那里声明(这样每个线程都将拥有这些变量的自己的副本(。这也可以扩展到idum。此外,最后一个if(寻找最大值(可以/应该放在一个单独的循环中,并运行单线程,或者使用适当的OpenMP指令来处理bigimax