Écologie de la plate-forme GPU : analyse comparative de Nvidia CUDA et AMD ROCm

Un écosystème de plate-forme mature et complet est le fossé pour les fabricants de GPU. Comparée à la puissance dure des barrières techniques induite par la micro-architecture continuellement itérative, la forte adhérence aux utilisateurs formée par l'écologie logicielle mature façonnera pour longtemps la puissance douce des fabricants de GPU. L'architecture de conception matérielle et logicielle, en prenant Nvidia CUDA comme exemple, fournit une interface d'accès direct au matériel sans s'appuyer sur le mappage de l'API graphique, réduisant la difficulté de compilation pour les développeurs GPGPU, réalisant ainsi un écosystème de développeurs très collant. Les plates-formes de développement grand public actuelles incluent également AMD ROCm et OpenCL.

CUDA (Compute Unified Device Architecture) est une architecture de calcul parallèle à usage général lancée par NVIDIA en 2006, comprenant l'architecture de jeu d'instructions CUDA (ISA) et le moteur de calcul parallèle à l'intérieur du GPU. Cette architecture permet aux développeurs d'utiliser des langages de programmation de haut niveau (tels que le langage C) pour utiliser les capacités de calcul parallèle du matériel GPU et pour allouer et gérer les tâches de calcul.CUDA fournit une solution plus efficace aux problèmes de calcul de données à grande échelle que Les processeurs Les domaines d'apprentissage en profondeur et d'inférence sont largement utilisés.

En plus d'être une architecture de calcul parallèle, CUDA est également un langage commun permettant aux CPU et aux GPU de coordonner leur travail. Dans le modèle de programmation CUDA, il existe principalement deux concepts d'hôte (hôte) et de périphérique (périphérique).L'hôte comprend le processeur et la mémoire hôte, et le périphérique comprend le processeur graphique et la mémoire vidéo.La transmission de données entre les deux s'effectue via le bus PCI Express . Dans une implémentation CUDA spécifique, le programme est généralement divisé en deux parties, le code de l'hôte s'exécutant sur l'hôte et le code de l'appareil s'exécutant sur l'appareil. Le code hôte est responsable du contrôle global du processus et de l'échange de données du programme, tandis que le code de l'appareil est responsable de l'exécution de tâches informatiques spécifiques.

Un programme CUDA complet est composé d'une série de parties parallèles de fonctions côté appareil et de parties de traitement série côté hôte. De cette façon, l'hôte et l'appareil peuvent travailler ensemble efficacement pour réaliser le calcul accéléré par GPU.

La bibliothèque de fonctions que CUDA exécute sur l'hôte comprend trois parties : la bibliothèque de développement (Bibliothèques), le moteur d'exécution (Runtime) et le pilote (Driver). Parmi eux, les bibliothèques fournissent des bibliothèques de calcul de tâches mathématiques et scientifiques courantes, l'API Runtime fournit une interface de développement d'applications pratique et des composants d'exécution, les développeurs peuvent gérer automatiquement les ressources GPU en appelant l'API, et l'API Driver fournit une série de fonctions C. Les bibliothèques peuvent contrôler les ressources GPU. à un niveau inférieur et plus efficace, mais les développeurs correspondants doivent gérer manuellement des tâches complexes telles que la compilation de modules.

La fonction que CUDA exécute sur l'appareil est la fonction noyau (Kernel), qui est généralement utilisée pour le calcul parallèle et le traitement des données. Dans le noyau, la partie parallèle est exécutée K fois en parallèle par K threads CUDA différents, ce qui ne diffère qu'une seule fois des fonctions C/C++ ordinaires. Chaque noyau CUDA commence par un spécificateur de déclaration et le programmeur fournit à chaque thread un ID global unique en utilisant la variable intégrée __global__. Un groupe de threads est appelé un bloc CUDA (bloc). Les blocs CUDA sont regroupés dans une grille et un noyau s'exécute comme une grille de blocs de threads. Chaque bloc CUDA est exécuté par un multiprocesseur de streaming (SM) et ne peut pas être migré vers d'autres SM dans le GPU. Un SM peut exécuter plusieurs blocs CUDA simultanés, en fonction des ressources requises par le bloc CUDA. Chaque cœur s'exécute sur une exécution sur un périphérique, CUDA prend en charge l'exécution simultanée de plusieurs noyaux sur un périphérique.

Un écosystème logiciel riche et mature est la principale raison pour laquelle CUDA est largement utilisé.

(1) Langage de programmation : CUDA ne prend en charge que la programmation en langage C à partir de la version initiale 1.0, et maintenant CUDA 12.0 prend en charge C, C++, Fortran, Python et d'autres langages de programmation. En outre, NVIDIA prend également en charge de nombreuses chaînes d'outils tierces telles que PyCUDA, ltimesh Hybridizer, OpenACC, etc., pour améliorer en permanence l'expérience des développeurs.

(2) Bibliothèques : NVIDIA fournit une couche de collecte appelée CUDA-X sur la plate-forme CUDA. Les développeurs peuvent rapidement déployer des bibliothèques communes dans de nombreux domaines tels que cuBLA, NPP, NCCL, cuDNN, TensorRT et OpenCV via CUDA-X.

(3) Autres : NVIDIA fournit également aux développeurs CUDA des outils pour simplifier le processus de déploiement de conteneurs et étendre les applications dans un environnement de cluster, ce qui facilite l'accélération des applications et rend la technologie CUDA applicable à un plus large éventail de domaines.

ROCm (Radeon Open Compute Platform) est l'écosystème de calcul GPU d'AMD basé sur des projets open source, similaire à CUDA de NVIDIA. ROCm prend en charge plusieurs langages de programmation, compilateurs, bibliothèques et outils pour accélérer les applications dans des domaines tels que le calcul scientifique, l'intelligence artificielle et l'apprentissage automatique. ROCm prend également en charge plusieurs fournisseurs et architectures d'accélérateurs, offrant une portabilité et une interopérabilité ouvertes.

ROCm prend en charge les deux modèles de programmation GPU HIP (de type CUDA) et OpenCL, qui peuvent réaliser la migration de CUDA vers ROCm. Le dernier ROCm 5.0 prend en charge les conteneurs de framework AI sur AMD Infinity Hub, notamment TensorFlow 1.x, PyTorch 1.8, MXNet, etc., tout en améliorant les performances et la stabilité des bibliothèques et outils ROCm, notamment MIOpen, MIVisionX, rocBLAS, rocFFT, rocRAND wait .

OpenCL (Open Compute Language) est une norme ouverte pour la programmation parallèle générale de systèmes hétérogènes pouvant s'exécuter sur plusieurs plates-formes et appareils. OpenCL prend en charge plusieurs langages de programmation et environnements, et fournit une multitude d'outils pour aider au développement et au débogage. Il peut utiliser simultanément différents types d'accélérateurs tels que CPU, GPU et DSP pour effectuer des tâches, et prend en charge la transmission et la synchronisation des données.

De plus, OpenCL prend en charge les modèles de programmation parallèle à grain fin et à grain grossier, et le modèle approprié peut être sélectionné en fonction des exigences de l'application pour améliorer les performances et l'efficacité. Cependant, OpenCL a une portabilité limitée et il existe certaines différences dans le support fonctionnel et les performances des différentes plates-formes et appareils.Comparé à CUDA, il manque un support communautaire étendu et un écosystème mature.

Réimprimé de : Smart Core World

おすすめ

転載: blog.csdn.net/Ai17316391579/article/details/131572724