DirectX 12 expose les files d'attente de commandes pour les graphiques (appelés "directs"), les tâches de calcul ou de copie. En termes de fonctionnalités fournies, chacune est un super-ensemble de la suivante. La spécification stipule que les files d'attente de commandes peuvent être exécutées simultanément par le périphérique. Cependant, l'API ne limite en aucune façon le nombre de files d'attente de commandes (du moins je ne connais aucune limitation).
Apparemment, différents fournisseurs gèrent cela très différemment:
- Intel déclare dans une récente présentation (diapositive 23) qu'actuellement leurs GPU ne sont pas capables de gérer Graphics & Compute en parallèle et que le moteur de copie a un faible débit. Ils déconseillent l'utilisation de plusieurs files d'attente graphiques / de calcul.
- AMD a commencé il y a longtemps à annoncer l'utilisation de files d'attente / "shaders asynchrones" à partir de Mantle et des consoles gen actuelles. Il existe également certains développeurs ( exemple ) qui confirment des gains de performances significatifs en exécutant des tâches de calcul et graphiques en parallèle.
- Il y a eu récemment une agitation à propos de Nvidia ne supportant pas shaders asynchrone dans le matériel: l' utilisation de graphiques séparés et la file d' attente Compute au semble une fois pour rendre les choses plus lent qui indique l' émulation du pilote. Les opérations de copie parallèle, en revanche, sont prises en charge par CUDA depuis très longtemps, ce qui montre clairement que le moteur DMA peut fonctionner indépendamment.
Existe-t-il un moyen de décider au moment de l'exécution s'il est significatif de valider des CommandLists dans plusieurs CommandQueues au lieu d'une seule? (étant donné que l'ancien cas n'implique pas beaucoup de frais généraux d'ingénierie)
Bien que je puisse facilement voir comment il est utile d'effectuer des opérations de mémoire parallèlement aux opérations de calcul / graphiques, il me semble inutilement compliqué d'exécuter plusieurs processus de calcul et graphiques en parallèle (à moins qu'il n'y ait aucun avantage majeur en termes de performances). Je ne vois pas non plus comment cela peut conduire à de bien meilleures performances de toute façon; sauf pour les cas pathologiques où de nombreuses petites tâches séquentielles ne sont pas en mesure de générer suffisamment de charge GPU.
Réponses:
Envoyez votre application avec une séquence d'analyse comparative de la plate-forme réelle. (Réponse possible pour de nombreuses questions, je suppose ...)
Je soupçonne que les performances dépendent fortement de la façon dont vous utilisez le matériel. Comme il est peu probable que le matériel instrumente votre application en arrière, vous disant quoi faire, je choisirais tout ce qui semble bon dans votre conception.
Le mot clé est CAN. Je ne vois aucune raison pour laquelle un fournisseur bousillerait cela. En fin de compte, c'est le fournisseur de la plate-forme (Intel / AMD / Nvidia) qui est responsable de vous faire un pilote suffisamment bon pour que vous n'envisagiez pas de changer de fournisseur. S'ils ont un «problème connu» avec cette fonctionnalité (qui n'a d'ailleurs aucune signification fonctionnelle, seulement des performances), ils devraient également le résoudre en utilisant ce qu'ils savent. Je veux dire pour pleurer à haute voix, le repli est quelque chose qu'ils ont déjà mis en œuvre; exécution synchrone.
Le matériel est assez vaudou comme pour les développeurs.
la source