La multiplication de la matrice OpenMP C ++ s'exécute plus lentement en parallèle
Je suis en train d'apprendre les bases de la parallèle de l'exécution de la boucle for en utilisant OpenMP.
Malheureusement, mon paralel programme s'exécute 10x plus lent que la version de série.
Ce que je fais mal? Je suis pas certains obstacles?
double **basicMultiply(double **A, double **B, int size) {
int i, j, k;
double **res = createMatrix(size);
omp_set_num_threads(4);
#pragma omp parallel for private(k)
for (i = 0; i < size; i++) {
for (j = 0; j < size; j++) {
for (k = 0; k < size; k++) {
res[i][j] += A[i][k] * B[k][j];
}
}
}
return res;
}
Merci beaucoup!
source d'informationauteur Hynek Blaha
Vous devez vous connecter pour publier un commentaire.
En plus. "Boson Z", j'ai testé votre code C sur l'ordinateur portable avec processeur intel i5 (2 cœurs physiques ou 4 logique). Malheureusement, la vitesse de calcul n'est pas très rapide. Pour 2000x2000 double aléatoire matrices j'ai obtenu les résultats suivants (à l'aide de VS 2010 avec OpenMP 2.0):
Compilé pour Win64: C = A*B, où A,B sont des matrices avec la taille (2000x2000):
Compilé pour Win32: C = A*B, où A,B sont des matrices avec la taille (2000x2000):
À noter que pour les "Hynek Blaha de code", le temps de calcul sur mon système est 739.208 s (226.62 s avec openMP)!
Alors que dans Matlab x64:
le temps de calcul est 0.591440 secondes.
Mais en utilisant openBLAS paquet, j'ai atteint une vitesse de 0.377814 secondes (en utilisant minGW avec openMP 4.0).
Le Tatou paquet fournit un moyen simple (à mon avis) pour la connexion de la matrice des opérations avec openBLAS (ou d'autres offres similaires). Dans ce cas, le code est
Si
size
est petit, la surcharge de fil-la synchronisation de l'ombre tout gain de performances de calcul parallèle.