Existe-t-il un moyen de sélectionner par programmation le GPU de rendu dans un environnement multi-GPU? (Les fenêtres)

Question

J’ai une application OpenGL qui fonctionnera sur des machines avec diverses configurations multi-GPU (et éventuellement différentes versions de Windows, de XP à 7). Existe-t-il un moyen général de sélectionner le GPU spécifique qui fera office de moteur de rendu OpenGL indépendamment de la combinaison du processeur graphique (NVIDIA + NVIDIA, NVIDIA + AMD, NVIDIA + Intel, etc.)? Il doit s’agir d’une solution pouvant être appliquée à partir du code de l’application, c’est-à-dire directement en C ++ ou d’un script appelé à partir de l’application, sans intervention de l’utilisateur final.

Vous trouverez ci-dessous les détails de plusieurs tests que j’ai effectués pour essayer de trouver une solution, en commençant par des cas très spécifiques, mais peut-être existe-t-il une solution qui peut fonctionner dans tous les cas ou dans la plupart des cas.

Existe-t-il une méthode fiable pour forcer quel GPU effectue le rendu OpenGL?

Tout indice sera très apprécié. Merci d’avance!

Essayé des solutions possibles

Windows XP 64 avec deux NVIDIA Quadro

Test avec des combinaisons de deux cartes Quadro

  • Quadro FX 1700 + Quadro FX 570
  • Quadro FX 1700 + Quadro FX 540
  • Quadro FX 1700 + Quadro NVS 285

en utilisant le même pilote (version 275.36) sous Windows XP 64 bits, j’ai eu un succès relatif avec diverses méthodes, telles que:

  • Laisser le conducteur décider.
    Cette solution n’est valable que si les deux cartes utilisent le même pilote et qu’elle décide d’utiliser la carte souhaitée. Donc, c’est trop spécifique et peut-être imprévisible.

  • Modifier les parameters du pilote dans le code avec NVAPI avant de laisser le pilote décider.
    Avec cette solution, il est en théorie possible de décider le pilote comme je le souhaite, mais c’est difficile, les deux cartes doivent utiliser les mêmes pilotes et ne fonctionnent pas toujours (avec FX 1700 + NVS 285, cela ne fonctionne pas).

  • Changer l’écran principal.
    Cela a pour effet que l’application s’ouvre par défaut dans l’écran principal sélectionné. Cette solution a fonctionné seule avec la combinaison FX 1700 + FX 570. Avec le FX 1700 + FX 540, le moteur de rendu dépend des parameters du pilote, indépendamment de l’écran principal, et avec le FX 1700 + NVS 285, le moteur de rendu est toujours le FX 1700.

  • Création du contexte OpenGL lorsque la fenêtre se trouve dans un écran spécifique.
    La fenêtre peut être créée dans l’écran souhaité, indépendamment du principal, mais elle présente les mêmes problèmes que la solution ci-dessus.

  • Créer le contexte OpenGL ayant activé uniquement l’écran dans la carte graphique souhaitée puis activer l’autre / s.
    C’est le seul moyen pour utiliser le NVS 285 comme moteur de rendu, mais c’est moche et je ne sais pas s’il est automatisable ou s’il fonctionne dans tous les cas.

  • Essayer de sélectionner le GPU de rendu en utilisant l’extension WGL_NV_gpu_affinity .
    Avec la combinaison du FX 1700 et du FX 570, l’extension indique que les deux GPU sont compatibles et que je ne peux en limiter le rendu qu’à l’un d’eux. Avec la paire FX 1700 + FX 540, l’extension ne signale qu’un seul GPU compatible, celui que le pilote décide d’utiliser pour le rendu OpenGL. Avec la combinaison FX 1700 + NVS 285, seule la FX 1700 est signalée, toujours (je suppose que le NVS 285 ne supporte pas cette extension, car si c’est la seule carte utilisée, elle n’est toujours pas signalée par l’extension).

Windows 7 64 avec Intel et AMD

Ce système fonctionne avec Windows 7 64-bit et les cartes graphiques sont un Intel HD Graphics 2000 (intégré dans le CPU (Sandy Bridge)) et un AMD Radeon HD 6450. Dans tous les cas, le rendu fonctionne sur les deux écrans, mais le GPU de rendu varie en fonction de certaines variables:

  • Si l’écran principal est connecté à l’AMD et que la fenêtre s’ouvre dans cet écran, l’AMD est le moteur de rendu.
  • Si l’écran principal est connecté à l’AMD et que la fenêtre s’ouvre sur l’autre écran, le moteur de rendu est “GDI Generic”, ce qui est très lent.
  • Si l’écran principal est connecté à Intel, alors Intel est le moteur de rendu, indépendamment de l’endroit où la fenêtre est ouverte.

Avec ce système, j’ai également essayé une solution proposée dans les forums OpenGL . TL; DR: c’est une méthode de piratage pour choisir le pilote utilisé par OpenGL, ainsi il peut choisir entre des GPU qui utilisent des pilotes différents, mais pas entre des cartes qui utilisent le même pilote. J’ai obtenu les résultats suivants:

  • Si l’écran principal est connecté à l’AMD, je peux choisir n’importe quel processeur graphique en tant que moteur de rendu.
  • Si l’écran principal est connecté à Intel, je peux choisir Intel comme moteur de rendu (inutile, car c’est automatique), mais j’obtiens une erreur si j’essaie de choisir l’AMD; Je pense que cela peut être un bug dans le pilote.

Comme vous utilisez des cartes nvidia Quadro, vous pouvez utiliser l’extension WGL_NV_gpu_affinity pour sélectionner le GPU.

Je ne suis pas sûr des puces ATI, mais je pense que c’est AMD_gpu_association