我是一個新的OpenMp Programer,現在我遇到了乘以兩個矩陣的問題。這是我的並行代碼,但速度並不像我想象的那麼快。 例如我給它一個3000 * 3000矩陣和3000 * 3000和我的域爲2(隨機數爲0或1)和並行慢於順序並行乘法矩陣openmp比序列更慢
clock_t tStart = clock();
cout<<(char)169<<" parallel "<<(char)170<<endl;
int a,b,c,Domain ;
cin>>a>>b>>c>>Domain;
srand(time(0));
int **arr1;
int **arr2;
int **arrRet;
arr1 = new int*[a];
#pragma omp for schedule (dynamic)
for(int i=0 ; i<a ; i++)
arr1[i] = new int [b];
arr2 = new int*[b];
#pragma omp for schedule (dynamic)
for(int i=0 ; i<b ; i++)
arr2[i] = new int [c];
arrRet = new int*[a];
#pragma omp for schedule (dynamic)
for(int i=0 ; i<a ; i++)
arrRet[i] = new int [c];
#pragma omp for schedule (dynamic)
for(int i=0 ; i<a ; i++)
{
#pragma omp for schedule (dynamic)
for(int j=0; j<b ; j++)
{
arr1[i][j]=rand()%Domain;
}
}
//cout<<"\n\n\n";
#pragma omp for schedule (dynamic)
for(int i=0 ; i<b ; i++)
{
#pragma omp for schedule (dynamic)
for(int j=0 ; j<c ; j++)
{
arr2[i][j]=rand()%Domain;
}
}
//cout<<"\n\n\n";
#pragma omp for schedule (dynamic)
for(int i=0 ; i<a ; i++)
#pragma omp for schedule (dynamic)
for(int j2=0 ; j2<c ; j2++)
{
int sum=0;
#pragma omp parallel for shared(sum) reduction(+:sum)
for(int j=0 ; j<b ; j++)
{
sum+=arr1[i][j]*arr2[j][j2];
}
arrRet[i][j2]=sum;
}
printf("Time taken : %.4fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
的可能的複製[OpenMP的時間和時鐘()計算兩個不同的結果](HTTPS:/ /stackoverflow.com/questions/10673732/openmp-time-and-clock-calculates-two-different-results)和https://stackoverflow.com/q/10624755/620382 – Zulan
不要自己做矩陣乘法。這太瘋狂了。矩陣乘法是本書中最古老的問題。找一些圖書館爲你做這些,比如OpenBLAS。也可以使用[Armadillo](http://arma.sourceforge.net/)來保存矩陣。停止保留這些不良陣列以保存矩陣。它們很慢,因爲你的編譯器不能[矢量化](https://en.wikipedia.org/wiki/Automatic_vectorization)它們。您可以將Armadillo與OpenBLAS連接起來,它可以爲您和您的處理器功能進行並行處理,從而爲您提供最佳性能。 –
@TheQuantumPhysicist我的老師告訴我我不能使用庫:( – ali