我正在並行化共軛梯度法來求解稀疏矩陣。 CG方法在算法中調用子程序「matrixVectorProduct()」。我正在嘗試專門對此子例程進行並行化。以下是我正在使用的以CSR格式存儲的SYMMETRIC矩陣的代碼。Open MP:稀疏矩陣的對稱矩陣乘法
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編譯指示循環正在按期望的。但似乎有一個問題,當我平行第二個循環類似。它沒有給出正確的輸出。
有人可以指示我在做什麼我錯了在第二個雜注循環。我是多線程和開放MP的新手。
謝謝。