我是多線程的新手。我正在設計一個解決稀疏矩陣的程序。在我的代碼中,我多次調用Vector Vector dot product和Matix vector product作爲子程序,以達到最終解決方案。我試圖使用開放MP(特別是上面的兩個子例程)並行化代碼。我也有序列代碼,我不打算並行化。稀疏矩陣的多線程程序
我的問題是如何處理調用子例程時創建的線程。我應該在每個子例程調用結束時放置一個障礙嗎?
另外我應該在哪裏設置線程數?
Mat_Vec_Mult(MAT,x0,rm);
#pragma omp parallel for schedule(static)
for(int i=0;i<numcols;i++)
rm[i] = b[i] - rm[i];
#pragma omp barrier
#pragma omp parallel for schedule(static)
for(int i=0;i<numcols;i++)
xm[i] = x0[i];
#pragma omp barrier
double* pm = (double*) malloc(numcols*sizeof(double));
#pragma omp parallel for schedule(static)
for(int i=0;i<numcols;i++)
pm[i] = rm[i];
#pragma omp barrier
scalarProd(rm,rm,numcols);
感謝
編輯:
的標量dotproduct,我現在用的是下面這段代碼:
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 shared(vec1,vec2,c,prod) private(i)
#pragma omp parallel
{
double pprod = 0.0;
#pragma omp for
for(i=0;i<n;i++) {
pprod += vec1[i]*vec2[i];
}
//#pragma omp for reduction (+:prod)
#pragma omp critical
for(i=0;i<n;i++) {
prod += pprod;
}
}
return prod;
}
我現在已經增加了時間計算的代碼在我的共軛梯度功能如下:
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
我在我的英特爾I7筆記本電腦上在Linux操作系統上使用gcc -fopenmp命令進行簡單編譯。
我目前使用的大小的矩陣N = 5000
我得到巨大的速度整體下降,因爲直到實現收斂(80K左右的時間)相同的點積被多次調用。
請提出一些改進建議。任何幫助深表感謝!
顯示一些代碼會幫助很多。關於線程數 - 您是否查看了OpenMP文檔? – lisyarus
我已經包含了代碼。與代碼順序完成時相比,當我執行代碼中顯示的向量更新時,性能略有下降。並行化例程標量和矩陣矢量乘法也進一步惡化了性能。 –
在每個工作共享'for'子句的最後應用了一個隱含屏障。 –