Open MP:稀疏矩阵的对称矩阵乘法

时间:2016-04-30 16:15:15

标签: c multithreading parallel-processing openmp sparse-matrix

我正在研究Conjugate梯度方法的并行化以解决稀疏矩阵。 CG方法在算法中调用子例程“matrixVectorProduct()”。我试图具体地并行化这个子程序。以下是我正在处理的以CSR格式存储的SYMMETRIC矩阵的代码。

<div class="form-group">
    <a for="collapseOne" data-toggle="collapse" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne">+ Not Jerky</a>
    <div class="collapse" id="collapseOne" style="padding: 0;">
        <textarea class="form-control" rows="4" style="padding: 20px;">No padding on animated element. Padding on child.</textarea>
    </div>
</div>

并行化后的代码是:

void matrixVectorProduct(MTX *MAT, double* inVec, double* outVec){

int i,j, ckey;

if((matcode[1] == 'X')&&(matcode[3] == 'S')) 
{
    //Initialize outVec to zeros
    for(int j=0;j<MAT->nrows;j++)
            outVec[j] = 0.0;

        for(i=0;i<MAT->nrows;i++) 
            for(ckey=MAT->row_ptr[i];ckey<MAT->row_ptr[i+1];ckey++) {
                j = MAT->JA[ckey];
                outVec[i] = outVec[i] + MAT->val[ckey] * inVec[j];
            }

        for(int i=0;i<MAT->nrows;i++) 
            for(int ckey=MAT->row_ptr[i];ckey<MAT->row_ptr[i+1];ckey++) {
                j = MAT->JA[ckey];
                if(j!=i)
                    outVec[j] += MAT->val[ckey] * inVec[i];;
            }
}
else
{
    fprintf(stderr,"\n Not a symmetric Matrix. CG method not applicable\n");
    exit(1);
}       
return;}

第一个omp pragma循环正在按需运行。但是,当我同样并行化第二个循环时似乎存在问题。它没有提供正确的输出。

有人可以指导我在第二个pragma循环中做错了什么。我是多线程和开放MP的新手。

感谢。

1 个答案:

答案 0 :(得分:1)

第二个循环中存在数据竞争,因为多个线程可以更新相同的向量元素。使用:

setImmediate(true)

确保更新的原子性。