并行化矢量矢量点积

时间:2016-04-27 21:50:02

标签: c multithreading openmp

我有一个子程序,它计算大矢量的矢量点积。我使用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次),因此整体速度大幅下降。

请建议我任何改进。我觉得我做的事情非常糟糕。

谢谢! :)

1 个答案:

答案 0 :(得分:-2)

Prod对于每个线程都是私有的,但它的值取决于前一次迭代。尝试:

刺[I] + = VEC1 [I] * VEC2 [I];