2013-03-17 6 views
0

Modifier: Mon premier exemple de code était erroné. Fixé avec un plus simple.Restriction de bande passante OpenMP et mémoire

J'implémente une bibliothèque C++ pour les opérations algébriques entre grands vecteurs et matrices. J'ai trouvé sur les processeurs x86-x64 que les ajouts de vecteurs parallèles OpenMP, le produit scalaire, etc. ne vont pas plus vite que le simple thread. Les opérations en parallèle sont de -1% à 6% plus rapides que les opérations à un seul thread. Cela se produit en raison de la limitation de la bande passante de la mémoire (je pense).

Ainsi, la question est, est-il réel avantage de performance pour le code comme ceci:

void DenseMatrix::identity() 
{ 
    assert(height == width); 
    size_t i = 0; 
    #pragma omp parallel for if (height > OPENMP_BREAK2) 
    for(unsigned int y = 0; y < height; y++) 
     for(unsigned int x = 0; x < width; x++, i++) 
      elements[i] = x == y ? 1 : 0; 
} 

Dans cet exemple il n'y a pas sérieux inconvénient d'utiliser OpenMP. Mais si je travaille sur OpenMP avec Sparse Vectors et Sparse Matrices, je ne peux pas utiliser par exemple * .push_back(), et dans ce cas, la question devient sérieuse. (Les éléments de vecteurs épars ne sont pas continus comme des vecteurs denses, donc la programmation parallèle a un inconvénient car les éléments résultants peuvent arriver n'importe quand - pas pour un index plus bas)

Répondre

1

Je ne pense pas que ce soit un problème de bande passante mémoire. Je vois clairement un problème sur r: r est accessible à partir de plusieurs threads, ce qui provoque à la fois courses de données et partage faux. Un faux partage peut nuire considérablement à vos performances.

Je me demande si vous pouvez obtenir la bonne réponse, car il y a des courses de données sur r. Avez-vous obtenu la bonne réponse?

Cependant, la solution serait très simple. L'opération menée sur r est réduction, ce qui peut être facilement réalisé par la clause reduction de OpenMP.

Essayez de simplement juxtaposer reduction(+ : r) après #pragma omp parallel.

(Note:.. Les ajouts sur double ne sont pas commutative et associative Vous pouvez voir quelques erreurs de précision, ou quelques différences avec le résultat du code de série)

Questions connexes