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)