Au cours des dernières années, plusieurs bibliothèques / projets logiciels sont apparus qui offrent une forme ou une autre de parallélisme à mémoire partagée basé sur des données à usage général.
L'idée principale est qu'au lieu d'écrire un code explicitement threadé, les programmeurs implémentent leurs algorithmes en tant que tâches interdépendantes qui sont ensuite planifiées dynamiquement par un middleware à usage général sur une machine à mémoire partagée.
Des exemples de telles bibliothèques sont:
QUARK : Conçu à l'origine pour la bibliothèque d'algèbre linéaire parallèle MAGMA , semble également avoir été utilisé pour une méthode multipolaire rapide parallèle .
Cilk : à l'origine un projet basé sur le MIT, désormais pris en charge par Intel, implémenté en tant qu'extensions de langage / compilateur pour C, utilisé dans le logiciel d'échecs informatique Cilkchess et expérimentalement dans FFTW .
SMP superscalar : développé au Barcelona Supercomputing Center, similaire à Cilk à bien des égards, basé sur des
#pragma
extensions.StarPU : bibliothèque similaire de "codelets" qui peut être compilée et planifiée sur plusieurs architectures différentes, y compris les GPU.
Tâches OpenMP: à partir de la version 3.0, OpenMP a introduit des "tâches" qui peuvent être planifiées de manière asynchrone (voir la section 2.7 de la spécification).
Intel's Threading Building Blocks : utilise des classes C ++ pour créer et lancer des tâches asynchrones, voir la section 11 du didacticiel.
OpenCL : prend en charge le parallélisme basé sur les tâches sur plusieurs cœurs.
Bien qu'il y ait beaucoup de littérature décrivant le fonctionnement interne de ces bibliothèques / extensions de langage et leur application à des problèmes spécifiques, je n'ai rencontré que très peu d'exemples de leur utilisation dans la pratique dans les applications de calcul scientifique.
Alors, voici la question: quelqu'un connaît-il des codes de calcul scientifique utilisant l'une de ces bibliothèques / extensions de langage, ou similaire, pour le parallélisme à mémoire partagée?
Réponses:
deal.II utilise les blocs de construction filetés dans toute la bibliothèque et, dans l'ensemble, nous en sommes raisonnablement satisfaits. Nous avons examiné quelques alternatives, en particulier OpenMP, car tout le monde semble utiliser cela pour des codes plus simples, mais les a trouvées manquantes. En particulier, OpenMP présente l'énorme inconvénient que son modèle de tâche ne vous permet pas d'obtenir un descripteur pour une tâche que vous avez démarrée, et par conséquent, il est difficile d'accéder à l'état d'une tâche (par exemple, pour attendre qu'elle se termine) ou de renvoyer des valeurs de fonctions que vous exécutez sur une tâche distincte. OpenMP est principalement bon pour paralléliser les boucles les plus internes , mais vous gagnez en efficacité parallèle en parallélisant les boucles les plus externes et complexes, et OpenMP n'est pas l'outil pour cela alors que le TBB est raisonnablement bon pour cela.
la source
À mon avis, ces systèmes ont relativement peu réussi en raison principalement des raisons suivantes.
MPI_Comm
qui permet à différentes bibliothèques d'effectuer des opérations riches sans entrer en collision, ainsi que de passer le contexte entre les bibliothèques et de récupérer les attributs nécessaires. L'abstraction fournie par le "communicateur" est importante pour la composition de la bibliothèque, que la mémoire partagée ou distribuée soit utilisée.la source