Je suis un nouveau programmeur OpenMp et maintenant j'ai un problème avec la multiplication de deux matrices. C'est mon code parallèle mais ce n'est pas aussi rapide que prévu. Par exemple, je donne un 3000 * 3000 matrice et 3000 * 3000 et mon domaine est 2 (le nombre aléatoire est 0 ou 1) et parallèle est plus lente que séquentiellematrice de multiplication parallèle openmp est plus lente que séquentielle
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);
double possible de [le temps et l'horloge OpenMP() calcule deux résultats différents] (https://stackoverflow.com/questions/10673732/openmp-time-and-clock-calculates-two-different-results) et https://stackoverflow.com/q/10624755/620382 – Zulan
Ne faites pas de multiplication matricielle vous-même. C'est dingue. La multiplication matricielle est le problème le plus ancien du livre. Obtenez une bibliothèque pour le faire pour vous, comme OpenBLAS. Utilisez également [Armadillo] (http://arma.sourceforge.net/) pour tenir vos matrices. Arrêtez de réserver ces tableaux boiteux pour conserver des matrices. Ils sont lents parce que votre compilateur ne peut pas les vectoriser (https://fr.wikipedia.org/wiki/Automatic_vectorization). Vous pouvez lier Armadillo avec OpenBLAS et il fera la parallélisation pour vous et vos caractéristiques de processeur pour vous donner les meilleures performances. –
@TheQuantumPhysicist Mon professeur me dit que je ne peux pas utiliser la bibliothèque :( – ali