Supposons que j'ai un ordinateur équipé d'un processeur multicœur et d'un GPU. Je voudrais écrire un programme OpenCL qui fonctionne sur tous les cœurs de la plateforme. Est-ce possible ou dois-je choisir un seul périphérique sur lequel exécuter le noyau?Il est possible d'étendre un noyau OpenCL pour l'exécuter simultanément sur le processeur et le GPU.
Il est possible d'étendre un noyau OpenCL pour l'exécuter simultanément sur le processeur et le GPU.
Répondre
En théorie oui, vous pouvez, l'API CL permet. Mais la plate-forme/implémentation doit le supporter, et je ne pense pas que la plupart des implémentations de CL le font. Pour ce faire, procurez-vous le cl_device_id de l'unité centrale et du périphérique GPU, et créez un contexte avec ces deux périphériques, en utilisant clCreateContext.
Non, vous ne pouvez pas répartir automagiquement un noyau à la fois sur le processeur et le GPU, c'est l'un ou l'autre.
Vous pouvez le faire mais cela impliquera de créer et de gérer manuellement deux files d'attente de commandes (une pour chaque périphérique).
Vous ne pouvez pas étendre un noyau à plusieurs périphériques. Mais si le code que vous utilisez n'est pas dépendant d'autres résultats (par exemple: traiter des blocs de 16 Ko de données, cela nécessite un traitement énorme), vous pouvez lancer le même noyau sur GPU et CPU. Et mettre des blocs sur le GPU et certains sur le CPU.
De cette façon, il devrait augmenter les performances.
Vous pouvez le faire en créant un clContext partagé pour le processeur et le GPU et 2 files d'attente de commandes.
Ceci n'est pas applicable à tous les noyaux. Parfois, le code du noyau s'applique à toutes les données d'entrée et ne peut pas être séparé en parties ou en morceaux.
La mise en file d'attente des éléments de travail massifs est une mauvaise pratique. La raison en est que vous provoquerez la famine de workitem de rendu (provoquant des mises à jour d'écran léthargiques écoeurantes), ou pire, il y a un chien de garde qui avortera et rechargera le conducteur visuel (déclenchera la détection d'accrochage). Une pratique beaucoup mieux (quand c'est possible bien sûr) est d'avoir un flux de travail, mais n'obtient pas les résultats des éléments avant plusieurs après avoir été mis en file d'attente pour l'exécution. Cela vous permet de limiter l'utilisation du GPU pour ne pas surcharger le travail de dessin à l'écran. – doug65536
Un contexte ne peut être que pour une plate-forme. Si votre code multi-périphérique doit fonctionner sur plusieurs plates-formes (par exemple, plate-forme Intel OpenCL et NVidia GPU), vous avez besoin de contextes distincts. Cependant, si le GPU et le CPU se trouvent sur la même plate-forme, alors oui, vous pouvez utiliser un contexte.
Si vous utilisez plusieurs périphériques sur la même plate-forme (deux GPU identiques ou deux GPU du même fabricant), vous pouvez partager le contexte, à condition qu'ils proviennent tous deux d'un seul appel clGetDeviceIDs.
EDIT: Je dois ajouter qu'un contexte GPU + CPU ne signifie pas une exécution CPU + GPU gérée automatiquement. Généralement, il est recommandé de laisser le pilote allouer un tampon mémoire pouvant être mis en mémoire DMA par le GPU pour des performances maximales. Dans le cas où vous avez le processeur et le GPU dans le même contexte, vous seriez en mesure de partager ces tampons entre les deux appareils.
Vous devez encore diviser la charge de travail vous-même. Ma technique d'équilibrage de charge préférée utilise des événements. Chaque élément de travail n, attachez un objet événement à une commande (ou mettez en file d'attente un marqueur) et attendez l'événement que vous avez défini il y a des éléments de travail (le précédent). Si vous n'aviez pas à attendre, vous devez augmenter n sur cet appareil, si vous deviez attendre, vous devriez diminuer n. Cela limitera la profondeur de la file d'attente, n planera autour de la profondeur parfaite pour garder l'appareil occupé. Vous devez le faire de toute façon pour éviter de provoquer la famine du rendu GUI. Il suffit de garder n commandes dans chaque file d'attente de commande (où le CPU et le GPU ont n séparé) et il se divisera parfaitement.
- 1. Est-il possible d'utiliser OpenCL pour PowerVR SGX530 GPU?
- 2. Quand le processeur attend-il sur le GPU?
- 3. OpenCL et GPU programmation Roadmap
- 4. Est-il possible d'exécuter un noyau cuda sur plusieurs gpus
- 5. OpenCL FFT lib pour les GPU?
- 6. Impossible de tuer le noyau défectueux fonctionnant sur NVIDIA GPU
- 7. Réduire la vitesse du GPU dans le noyau Linux
- 8. Est-il possible d'exécuter MIMD avec un framework OpenCL?
- 9. Est-il possible d'exécuter (et d'afficher) deux applications simultanément?
- 10. Est-il possible d'utiliser simultanément 2 backend I18n et d'utiliser le second uniquement comme repli?
- 11. Est-il possible de rendre accéléré le Flash GPU à 100%, même en dehors du navigateur?
- 12. Est-il possible d'utiliser WCF pour communiquer avec le logiciel Windows en mode noyau?
- 13. Le nettoyage OpenCl provoque la segfault
- 14. Paramètres d'affinité du processeur pour les modules du noyau Linux?
- 15. Comment puis-je forcer le compilateur OpenCL d'Apple à recompiler un noyau mis en cache?
- 16. Texture Traitement d'image sur le GPU?
- 17. Le redéploiement est-il possible?
- 18. Quel est le processeur Markdown le plus mature et le plus entretenu?
- 19. Détecter le goulot d'étranglement sur le programme et utiliser opencl pour accélérer
- 20. Serait-il possible pour un compilateur JIT d'utiliser GPU pour certaines opérations en coulisses?
- 21. Est-il possible de vérifier si un binaire statique est compatible avec un noyau?
- 22. CPU et GPU minuterie dans profileur visuelle cuda
- 23. OpenCL est-il bon pour la simulation par agent?
- 24. Existe-t-il un algorithme pour trier les tableaux de chaînes pour le GPU?
- 25. Est-il possible d'obtenir le
- 26. Problème avec la recompilation du noyau OpenCL ralentissant le programme et les problèmes de mémoire possibles à cause de cela
- 27. Lancement simultané de plusieurs noyaux en utilisant CUDA pour un GPU
- 28. gpu, le vieux matériel, l'accélération 3d et un lib
- 29. Comment faire pour android à l'appareil sur le processeur ARM9?
- 30. comment consacrer un noyau de processeur à une application
Ou, sur les systèmes qui ne prennent pas en charge deux appareils dans une plate-forme, mais le processeur a une plate-forme et le GPU a une autre plate-forme, vous pouvez simplement diviser manuellement le travail entre les deux. Envoyez une partie du travail à la CPU et une partie du travail au GPU. –