我有一个子程序,它计算大矢量的矢量点积。我使用open MP对它进行了并行化。以下是我的代码:
double scalarProd(double* vec1, double* vec2, int n){
double prod = 0.0;
int chunk = 10;
int i;
//double* c = (double*) malloc(n*sizeof(double));
omp_set_num_threads(4);
#pragma omp parallel
{
double pprod = 0.0;
#pragma omp for
for(i=0;i<n;i++) {
pprod += vec1[i]*vec2[i];
}
#pragma omp critical
for(i=0;i<n;i++) {
prod += pprod;
}
}
返回产品;
}
有人可以告诉我这里出了什么问题吗?我是多线程的新手
编辑:
添加更多信息。对不起,第一个计时器在这里。
上面提到的子程序是从我的函数ConjugateGradient()中多次调用的。我现在在我的ConjugateGradient函数中添加了时间计算代码,如下所示:
start_dotprod = omp_get_wtime();
rm_rm_old = scalarProd(rm,rm,MAT->ncols);
run_dotprod = omp_get_wtime() - start_dotprod;
fprintf(timing,"Time taken by rm_rm dot product : %lf \n",run_dotprod);
观察到的结果:点积所用的时间 顺序版本:0.000007s 并行版本:0.002110
我在Intel I7笔记本电脑上使用Linux操作系统上的gcc -fopenmp命令进行简单编译。
我目前正在使用大小为n = 5000的矩阵。
由于相同的点产品被多次调用直到达到收敛(大约80k次),因此整体速度大幅下降。
请建议我任何改进。我觉得我做的事情非常糟糕。
谢谢! :)
答案 0 :(得分:-2)
Prod对于每个线程都是私有的,但它的值取决于前一次迭代。尝试:
刺[I] + = VEC1 [I] * VEC2 [I];