44 votes

CUDA Driver API vs CUDA runtime

Lors de l'écriture d'applications CUDA, vous pouvez travailler au niveau du pilote ou à l'exécution de niveau, comme illustré sur cette image (Les bibliothèques sont CUFFT et CUBLAS mathématiques avancées):

CUDA layer model

Je suppose que le compromis entre les deux sont des performances accrues pour le bas-evel API, mais au prix d'une augmentation de la complexité du code. Quelles sont, concrètement, les différences et quels sont les choses importantes que vous ne pouvez pas faire avec l'API de haut niveau?

Je suis à l'aide de CUDA.net pour l'interopérabilité avec C# et il est construit comme une copie de l'API de pilote. Cela les encourage à écrire beaucoup de plutôt complexe de code en C# alors que le C++ équivalent serait plus simple en utilisant le moteur d'exécution de l'API. Est-il quelque chose à gagner en le faisant de cette manière? Le seul avantage que je peux voir, c'est qu'il est plus facile d'intégrer intelligent de gestion d'erreur avec le reste du code C#.

47voto

mch Points 3583

Le CUDA runtime permet de compiler et lier votre CUDA noyaux dans des exécutables. Cela signifie que vous n'avez pas à distribuer cubin fichiers avec votre application, ou de traiter avec les charger via le pilote de l'API. Comme vous l'avez constaté, il est généralement plus facile à utiliser.

En revanche, le pilote de l'API est plus difficile de programme, mais a fourni plus de contrôle sur la façon dont CUDA est utilisé. Le programmeur doit traiter directement avec l'initialisation, le module de chargement, etc.

Apparemment plus d'information détaillée sur le périphérique peut être interrogé via le pilote API que par l'exécution de l'API. Par exemple, la quantité de mémoire disponible sur l'appareil peut être interrogé uniquement par le biais de l'API de pilote.

À partir de la CUDA Guide du Programmeur:

Il est composé de deux Api:

  • Une API de bas niveau appelé le CUDA driver API,
  • Un plus haut niveau de l'API appelée l'API CUDA runtime qui est mis en œuvre sur le dessus de le CUDA driver API.

Ces Api sont mutuellement exclusifs: Une application doit utiliser soit l'un ou l' d'autres.

Le CUDA runtime facilite le code de l'appareil de gestion en offrant implicite l'initialisation, le contexte de la gestion, et la gestion du module. Le C de code hôte généré par nvcc est basé sur le CUDA runtime (voir la Section 4.2.5), de sorte les applications qui ont un lien à ce code doit utiliser l'API CUDA runtime.

En revanche, le CUDA driver API nécessite plus de code, est plus difficile à programmer et debug, mais offre un meilleur niveau de contrôle et est indépendant de la langue, car il ne traite cubin objets (voir Section 4.2.5). En particulier, il est plus difficile de configurer et de lancer de noyaux à l'aide de CUDA driver API, depuis l'exécution la configuration et les paramètres du noyau doit être spécifié de manière explicite les appels de fonction au lieu de l'exécution de la configuration de la syntaxe décrite dans la Section 4.2.3. Aussi, l'appareil l'émulation (voir la Section 4.5.2.9) ne fonctionne pas avec le CUDA driver API.

Il n'y a pas remarqué de différence de performances entre les API. Comment vos noyaux utilisation de la mémoire et de la manière dont ils sont disposés sur le GPU (dans les croisements et les blocs) aura un effet beaucoup plus prononcé.

21voto

Jason Dale Points 111

J'ai trouvé que pour le déploiement des bibliothèques dans les applications multi-thread, le contrôle sur CUDA contexte fourni par le pilote de l'API a été essentiel. La plupart de mes clients veulent intégrer l'accélération GPU dans des applications existantes, et ces jours-ci, presque toutes les applications multi-thread. Depuis que j'ai ne pouvait pas garantir que tous les code GPU serait initialisé, à l'exécution et libéré à partir du même thread, j'ai dû utiliser l'API de pilote.

Mes premiers essais avec diverses solutions de rechange à l'exécution de l'API conduit à l'échec, parfois de manière spectaculaire - j'ai trouvé que je pouvais à plusieurs reprises, instantanément redémarrer une machine en effectuant simplement le mauvais jeu de CUDA appels provenant de différents threads.

Depuis que nous avons migré le tout sur le Pilote API, tout a été bien.

J

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X