Combien de files d'attente directes / de calcul / de copie sont significatives?

11

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.

Wumpf
la source
1
Je ne pense pas qu'il existe actuellement un moyen significatif de faire ce genre de jugement, à part vérifier qui fabrique le GPU. En fin de compte, il y a plus de facteurs que «le matériel peut-il exécuter des commandes à partir de plusieurs files d'attente simultanément», et D3D12 résume ces détails. En fait, D3D12 ne fait même pas de distinction entre le matériel qui pourrait exécuter des files d'attente simultanément et ceux qui pourraient le faire séquentiellement, les documents disent simplement que leur abstraction permet une exécution simultanée.
MJP
1
bonne question ! Je pense également qu'il serait spécial de gagner en performance pour exécuter simultanément le calcul et l'ombrage. peut-être que des gains peuvent se produire grâce aux mêmes faits qui rendent l'hyperthreading plus rapide. entrelacement des opérations lorsque certaines unités sont occupées pour l'autre file d'attente. comme des shaders obstruant les unités de texture, qui ne sont pas utilisées par l'étape de calcul, qui obstrue elle-même le FPU ou le DPU.
v.oddou
C'est dommage. Peut-être alors «à part vérifier qui fabrique le GPU, non» compte déjà comme réponse s'il n'y en a pas plus. Après avoir lu tous ces trucs sur le marketing AMD, je suis content d'apprendre que je ne suis pas seul avec ma confusion.
Wumpf
1
Vous savez juste pour soulever un peu de poids dans l'importance (en fait peu d'importance) de cette question. Le SDK PS4 a un bogue qui ne permet pas d'émettre vers une autre file d'attente que la file d'attente 0. Je pense que si c'était si crucial, il aurait été corrigé plus rapidement.
v.oddou

Réponses:

1

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.

"... les files d'attente de commandes peuvent être exécutées simultanément par l'appareil ..."

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.

Andreas
la source
Le GCN d'AMD exécutera les graphiques et calculera simultanément, même lorsque les deux sont émis dans la file d'attente graphique, mais généralement pas sur plusieurs tampons de commande (plusieurs appels de dessin peuvent même être fragmentaires). Le pilote (ou l'application - je pense que dans DX12 ou Vulkan) doit vérifier les dépendances des données et bloquer si nécessaire (graphisme) et répartir (calculer). Plusieurs files d'attente de commandes seraient probablement utiles si vous avez un calcul vraiment asynchrone à partir de graphiques (comme la physique pour la prochaine image), mais je n'ai aucune expérience directe avec cela.
Daniel M Gessel