Différences de performance pyCUDA vs C?

Je suis nouveau dans la programmation CUDA et je me demandais comment la performance de pyCUDA est comparée aux programmes mis en œuvre dans la plaine C. La performance sera-t-elle à peu près la même? Y a-t-il des goulots que je devrais être au courant?

EDIT: J’ai évidemment essayé de chercher d’abord ce problème sur Google, et j’ai été surpris de ne trouver aucune information. c’est-à-dire que j’aurais excepté que les gens de pyCUDA ont répondu à cette question dans leur FAQ.

Si vous utilisez CUDA – que ce soit directement via C ou avec pyCUDA – tout le travail numérique lourd que vous effectuez est effectué dans des kernelx exécutés sur le gpu et écrits en CUDA C (directement par vous ou indirectement avec graines). Il ne devrait donc y avoir aucune différence réelle de performances dans ces parties de votre code.

Maintenant, l’initialisation des tableaux et toute parsing post-travail se feront en python (probablement avec numpy) si vous utilisez pyCUDA, ce qui sera généralement beaucoup plus lent que de le faire directement dans un langage compilé votre numpy / scipy a été construit de manière à ce qu’il soit directement lié à des bibliothèques hautes performances, ces appels au moins se dérouleront de la même manière dans les deux langues). Espérons que votre initialisation et votre finalisation ne représentent qu’une petite fraction du travail total que vous devez effectuer. Par conséquent, même si les frais généraux sont importants, ils n’auront toujours pas d’impact considérable sur la durée d’exécution.

Et en fait, s’il s’avère que les parties en python du calcul nuisent aux performances de votre application, commencer à développer pyCUDA peut s’avérer un excellent moyen de commencer, car le développement est nettement plus facile et vous pouvez toujours implémentez les parties du code qui sont trop lentes en Python en C droit, et appelez celles-ci à partir de python, pour obtenir le meilleur des deux mondes.

Si vous vous interrogez sur les différences de performances en utilisant pyCUDA de différentes manières, voir SimpleSpeedTest.py inclus dans les exemples de pyCUDA Wiki. Il compare la même tâche effectuée par un kernel CUDA C encapsulé dans pyCUDA et par plusieurs abstractions créées par le concepteur de pyCUDA. Il y a une différence de performance.

Cela fait un petit moment que j’utilise pyCUDA et j’aime bien le prototyper, car cela accélère le processus de transformation d’une idée en code fonctionnel.

Avec pyCUDA, vous allez écrire les kernelx CUDA en C ++, et c’est CUDA. Il ne devrait donc pas y avoir de différence de performances entre l’exécution de ce code. Mais il y aura une différence dans les performances du code que vous écrivez en Python pour configurer ou utiliser les résultats du kernel pyCUDA par rapport à celui que vous écrivez en C.

Assurez-vous que vous utilisez les optimisations -O3 et utilisez nvprof / nvvp pour profiler vos kernelx si vous utilisez PyCUDA et que vous souhaitez obtenir des performances élevées. Si vous voulez utiliser Cuda depuis Python, PyCUDA est probablement LE choix. Parce qu’interfacer du code C ++ / Cuda via Python est un enfer sinon. Vous devez écrire un tas d’enveloppes laides. Et pour une intégration numérique, un code de synthèse encore plus complexe serait nécessaire.