Je suis le développeur de VexCL mais j'aime vraiment ce que Kyle Lutz l'auteur de Boost.Compute a dit sur le même sujet sur Dynamiser la liste de diffusion . En bref, du point de vue de l'utilisateur Poussée Boost.Compute, la solution d'AMD pour le traitement des données. Boulon et probablement celle de Microsoft C++ AMP mettent toutes en œuvre une API de type STL, tandis que VexCL est une bibliothèque basée sur des modèles d'expression qui se rapproche davantage de l'API STL. Eigen par nature. Je crois que la principale différence entre les bibliothèques de type STL est leur portabilité :
- Thrust ne prend en charge que les GPU NVIDIA, mais peut également fonctionner sur les CPU grâce à ses backends OpenMP et TBB.
- Bolt utilise les extensions AMD d'OpenCL qui ne sont disponibles que sur les GPU AMD. Il fournit également des backends Microsoft C++ AMP et Intel TBB.
- Le seul compilateur qui prend en charge Microsoft C++ AMP est Microsoft Visual C++ (bien que les travaux sur Amener C++AMP au-delà de Windows est en train de se faire).
- Boost.Compute semble être la solution la plus portable de toutes, car elle est basée sur la norme OpenCL.
Encore une fois, toutes ces bibliothèques tentent d'implémenter une interface de type STL, elles ont donc une applicabilité très large. VexCL a été développé dans l'optique du calcul scientifique. Si Boost.Compute avait été développé un peu plus tôt, je pourrais probablement baser VexCL dessus :). Une autre bibliothèque pour le calcul scientifique qui vaut la peine d'être consultée est VienneCL L'utilisation d'une bibliothèque libre d'algèbre linéaire pour les calculs sur les architectures multi-coeurs (GPU, MIC) et les CPU multi-coeurs. Consultez [1] pour une comparaison de VexCL, ViennaCL, CMTL4 et Thrust dans ce domaine.
Concernant l'incapacité des développeurs de Thrust à ajouter un backend OpenCL : Thrust, VexCL et Boost.Compute (je ne suis pas familier avec l'intérieur des autres bibliothèques) utilisent tous des techniques de métaprogrammation pour faire ce qu'ils font. Mais comme CUDA supporte les templates C++, le travail des développeurs de Thrust est probablement un peu plus facile : ils doivent écrire des métaprogrammes qui génèrent des programmes CUDA avec l'aide du compilateur C++. Les auteurs de VexCL et Boost.Compute écrivent des métaprogrammes qui génèrent des programmes qui génèrent du code source OpenCL. Jetez un coup d'œil à la diapositives où j'ai essayé d'expliquer comment VexCL est implémenté. Je suis donc d'accord pour dire que la conception actuelle de Thrust les empêche d'ajouter un backend OpenCL.
[1] Denis Demidov, Karsten Ahnert, Karl Rupp, Peter Gottschling, Programmation de CUDA et OpenCL : une étude de cas utilisant les bibliothèques C++ modernes SIAM J. Sci. Comput. 35(5), C453-C472. (an version arXiv est également disponible).
Mise à jour : @gnzlbg a commenté qu'il n'y a pas de support pour les foncteurs et lambdas C++ dans les bibliothèques basées sur OpenCL. Et en effet, OpenCL est basé sur C99 et est compilé à partir de sources stockées dans des chaînes au moment de l'exécution, il n'y a donc pas de moyen facile d'interagir pleinement avec les classes C++. Mais pour être juste, les bibliothèques basées sur OpenCL supportent les fonctions utilisateur et même les lambdas dans une certaine mesure.
Cela dit, les bibliothèques basées sur CUDA (et peut-être AMP C++) ont l'avantage évident de disposer d'un compilateur en temps réel (peut-on même dire cela ?), de sorte que l'intégration avec le code utilisateur peut être beaucoup plus étroite.