gpt4 book ai didi

c - 打开 MP : Symmetric matrix multiplication for Sparse matrices

转载 作者:行者123 更新时间:2023-12-05 00:01:06 24 4
gpt4 key购买 nike

我正在研究并行化共轭梯度法来求解稀疏矩阵。 CG 方法在算法中调用子程序“matrixVectorProduct()”。我正在尝试专门并行化这个子程序。以下是我正在处理以 CSR 格式存储的 SYMMETRIC 矩阵的代码。

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

我的并行化后的代码是:

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;

#pragma omp parallel
{
#pragma omp for private(ckey,j) schedule(static)
for(i=0;i<MAT->nrows;i++) {
double zi = 0.0;
for(ckey=MAT->row_ptr[i];ckey<MAT->row_ptr[i+1];ckey++) {
j = MAT->JA[ckey];
zi = zi + MAT->val[ckey] * inVec[j];
}
outVec[i] += zi;
}
}

#pragma omp parallel
{
#pragma omp for private(ckey,j) schedule(static)
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 的新手。

谢谢。

最佳答案

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

if (j != i) {
#pragma omp atomic
outVec[j] += MAT->val[ckey] * inVec[i];
}

这确保了更新的原子性。

关于c - 打开 MP : Symmetric matrix multiplication for Sparse matrices,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36957230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com