Je veux exécuter des tâches parallèles sur le GPU et la CPU avec opencL multiples appareils. Les exemples standard d'AMD SDK ne sont pas très clairs sur ce sujet. Pouvez-vous informer des didacticiels ou des exemples supplémentaires sur ce sujet? Tout conseil fera. P>
merci. p>
5 Réponses :
Il n'y a rien de vous retenir de le faire. Vous aurez besoin de fournir tous les périphériques que vous souhaitez utiliser pour votre appel à CLCreatecontext () code> puis créez au moins une file d'attente de commande pour chacun d'eux. Selon ce que vous essayez de faire, vous devrez peut-être examiner les techniques de planification des tâches plus avancées, par exemple. Utiliser des files d'attente de commandes hors de commande et des événements pour planifier des tâches sur des appareils. P>
Avec clietplatforms, vous saurez si vous avez plus d'une plate-forme ou non. Si vous exécutez une carte GPU Nvidia et une CPU AMD, vous trouverez des plates-formes. Une plate-forme pour l'AMD SDK et une pour la mise en œuvre NVIDIA CUDA OPENCL. Avec ClgetDevices, vous trouverez pour chaque plate-forme que les appareils disponibles. Cela pourrait être une par plate-forme comme 1xgpu et 1xcpu. P>
Pour chaque périphérique Créez un contexte avec CLCreatecontext, puis vous pouvez exécuter en parallèle. P>
Malheureusement, vous ne trouverez pas de GPU et de la CPU dans cette situation. Pour exécuter Opencl sur le matériel NVIDIA, vous avez besoin de Nvidia's Runtime Bibliothèque. Il ne verra que les appareils NVIDIA. Si vous avez un GPU AMD, vous pouvez voir la CPU et le GPU à la fois, car ils partagent une bibliothèque d'exécution. AMD a créé une plus vraie plate-forme hétérogène.
Vous pouvez utiliser par exemple l'AMD OPENCLL et enregistrer la mise en œuvre pour NVIDA. Je l'ai fait une fois et autant que je sache, cela a fonctionné. Vous devez entrer les fournisseurs dans / etc / opencl / fournisseurs pour Linux. Pour Windows, je ne connais pas l'emplacement, mais il devrait y avoir quelque chose de similaire.
Les choses ont changé un peu de la dernière fois. Khronos a introduit un pilote client installable, c'est-à-dire une bibliothèque de Shim Opencl qui recherche des implémentations réelles et expose ses API. ( khronos.org/registry/cl/sdk /2.0/docs/man/xhtml/cl_khr_icd.h tml ).
Pour le tutoriel et les détails sur l'utilisation de plusieurs périphériques, vous pouvez renvoyer la section 4.12 du Guide de programmation AMD-APP-SDK P>
Exécution des tâches parallèles sur plusieurs périphériques nécessite une planification dynamique pour une bonne efficacité, car vous ne connaissez jamais les performances exactes de tout périphérique - cela dépend de la charge actuelle (non seulement par votre programme, mais également de toutes les autres), l'horloge actuelle (elle peut changer de manière significative sur la plupart des processeurs et des GPU en fonction du profil ou de la charge actuels d'économie d'énergie). En outre, les performances du monde réel peuvent dépendre de vos données d'entrée. P>
Bien sûr, vous pouvez écrire vous-même tout le code nécessitant vous-même comme toutes les autres réponses suggérées, mais à mon avis, c'est une perte de temps et c'est une bien meilleure idée d'utiliser la solution existante. Je recommande d'utiliser Starpu. J'ai utilisé Starpu dans mon projet Opencl et cela a bien fonctionné. StarPu vient avec des exemples comment écrire du code capable d'utiliser de multiples GPU et des processeurs efficacement. P>
Starpu : p>
Les processeurs traditionnels ont atteint des limites architecturales que les conceptions multicœurs hétérogènes et la spécialisation matérielle (par exemple les coprocesseurs, les accélérateurs, ...) ont l'intention d'aborder. Cependant, exploiter de telles machines introduit de nombreuses questions difficiles à tous les niveaux, allant des modèles de programmation et des compilateurs à la conception de solutions matérielles évolutives. La conception de systèmes d'exécution efficaces pour ces architectures est un problème critique. Starpu facilite généralement beaucoup plus facilement les bibliothèques de haute performance ou les environnements de compilateur d'exploiter des machines multicœurs hétérogènes éventuellement équipées de GPGPUS ou de processeurs de cellules: plutôt que de gérer des problèmes de faible niveau, les programmeurs peuvent se concentrer sur des préoccupations algorithmiques. P> blockQuote>
Il y a aussi un autre projet, Skepu, mais je ne l'ai pas essayé moi-même: p>
skepu : p>
Skepu est un tel cadre de programmation squelette pour les systèmes CPU multicœurs et multi-GPU. C'est une bibliothèque de modèles C ++ avec six squelettes parallèles de données et une tâche-parallèle, deux types de conteneurs et une prise en charge de l'exécution sur des systèmes multi-GPU à la fois avec Cuda et Opencl. Récemment, la prise en charge de l'exécution hybride, de la planification dynamique et de l'équilibrage de la charge de la performance est développée à Skepu en mettant en œuvre un backend pour le système d'exécution StarPu. P> blockQuote>
Si vous Google pour "Planification dynamique GPU CPU Opencl", vous pouvez trouver encore plus de projets et de documentation gratuits ou commerciaux utiles. P>
Guide de programmation OpenCL par Aftab Munshi & There vous donnera plus de détails. P>
Mon article Une enquête sur les techniques de calcul hétérogènes de la CPU-GPU traite de nombreux systèmes d'exécution et de programmation pour l'informatique à la fois de la CPU et GPU.