7
votes

Détecter les GPU nvidia sans Cuda

J'aimerais extraire un ensemble d'informations plutôt limitées sur NVIDIA GPU sans relier aux bibliothèques CUDA. Les seules informations nécessaires sont calculées et nom de la GPU, plus que cela pourrait être utile, mais elle n'est pas nécessaire. Le code doit être écrit en C (ou C ++). Les informations seraient utilisées au moment de la configuration (lorsque la boîte à outils CUDA n'est pas disponible) et au moment de l'exécution (lorsque le binaire exécuté n'est pas compilé avec le support CUDA) pour suggérer à l'utilisateur qu'un GPU pris en charge est présent dans le système. < / p>

Autant que je sache, cela est possible grâce à l'API du conducteur, mais je ne connais pas très bien les détails techniques de ce que cela nécessiterait. Donc, mes questions sont:

  • Quelles sont les étapes exactes pour remplir au moins l'exigence minimale (voir ci-dessus);

  • Y a-t-il un tel code source ouvert disponible?

    Notez que la première étape consisterait à avoir du code pour Linux, mais j'aurais finalement besoin de code indépendant de la plate-forme. Considérant la plate-forme - disponibilité de Cuda, pour une solution complète, cela impliquerait du code pour sur X86 / AMD64 pour Linux, Mac OS et Windows (au moins pour l'instant, la liste pourrait être bientôt étendue avec le bras).

    Modifier

    Qu'est-ce que je voulais dire par "il est possible à travers l'API du pilote" est qu'il faut pouvoir charger de manière dynamique libcuda.so et interroger les propriétés du périphérique à travers l'API du pilote. Je ne suis pas sûr des détails, cependant.


10 commentaires

Avez-vous considéré le Kit de déploiement Tesla (qui comprend des exemples de code source des requêtes Vous mentionnez, mais a quelques limitations)?


@RobertCrovella J'ai, mais je n'aime pas vraiment l'idée de distribuer des fichiers binaires. Quels sont les autres inconvénients?


Quels binaires parlez-vous que vous devez distribuer? libnvidia-ml.so est installé par le pilote NVIDIA (s'il s'agit d'un pilote "récent"). Donc, sans essayer de tout couvrir dans un commentaire, les limitations sont les suivantes: 1. Nécessite un pilote de NVIDIA "récent" approprié, 2. peut ne pas fournir autant d'informations sur les produits GeForce qu'il le fait sur Quadro et Tesla GPUS (bien que cette est en partie une limitation de GeForce, par exemple aucun support ECC).


En dehors de la curiosité, pourquoi la construction sans la boîte à outils Cuda n'est-elle pas non. Parce que c'est littéralement la chose la plus simple jamais avec elle.


Il existe un exemple de dispositifQuiserydrvapi dans les échantillons CUDA inclus avec le CUDA SDK (et commençant par CUDA 5.0, inclus avec la Distribution de Toolkit Cuda). Cela vous montre comment interroger ce dont vous avez besoin avec l'API du conducteur. Mais toutes les solutions suggérées nécessitent "liaison contre les bibliothèques CUDA". Je soupçonne que vous voulez juste dire que vous ne voulez pas mettre un lien contre la bibliothèque API de Cuda Runtime (Cudart), car cela vous obligerait à distribuer le Cudart partagé Lib.


@RobertCrovella: Je parlais de la bibliothèque libnvidia-ml.so, je n'ai pas réalisé que c'était inclus tous les conducteurs récents. Toutefois, la NVML ne peut pas fournir d'informations essentielles: Computer Capacité.


@ 8Bitwide: Tout simplement parce que si un binaire n'est pas compilé avec Cuda est dirigé sur une machine avec un GPU, je souhaite pouvoir dire à l'utilisateur qu'il pourrait valoir la peine d'envisager de recompiler.


@pszilard Le meilleur que j'ai pu proposer est de vérifier le modèle GPU avec DirectX ou OpenGL et comparer cela contre une liste connue. Cela n'est bien sûr pas optimal. Pour autant que je sache, Nvidia n'expose aucune API de Cuda à l'extérieur du SDK, vous laissant avec deux options. RIP La fonction de comteCudeDevice () hors du SDK (peut simplement être un couple d'en-tête et de DLL) ou de faire des recherches sérieuses et d'écrire votre propre mise en œuvre.


@ 8Bitwide Maintenir une liste de noms de GPU est l'enfer que je veux éviter - été là-bas, fait cela et les utilisateurs ont continué à demander pourquoi mon tout nouveau GPU n'est pas pris en charge. Je suis assez énervé à Nvidia pour ne pas activer les informations de calibre de calcul avec NVML.


@pszilard À ce stade, la solution la plus simple semble ne pas laisser que des fichiers binaires soient compilés sans le CUDA SDK, vous n'avez pas à inclure tout votre code CUDA dans le binaire, mais au moins la partie qui vérifie la capacité CUDA .


4 Réponses :


1
votes

sûr que ces personnes connaissent la réponse:

http://www.ozone3d.net/gpu_caps_viewer

Mais je ne peux que savoir que je pourrais être fait avec une installation de Cuda ou de Opencl.

Je pense qu'une seule façon pourrait utiliser OpenGL directement, c'est peut-être ce que vous parliez avec l'API du conducteur, mais je ne peux que vous donner ces exemples (Cuda requis):

http://www.nauc.edu / ~phil/hardware/nvidia/doc/src/devicequery/devicequery.cpp


0 commentaires

1
votes

Premier, je pense NVIDIA NVML est l'API que vous recherchez pour. Deuxièmement, il existe un projet open-source basé sur NVML appelé PapI NVML .


1 commentaires

Merci. Comme je l'ai mentionné dans un commentaire ci-dessus, NVIDIA NVML n'est pas un bon candidat, car AFaik ne fournit pas d'informations sur la capacité calculée. Je vais regarder Papi NVML, cependant, mais je soupçonne que cela ne fournira pas ces informations non plus.



8
votes

Malheureusement, NVML ne fournit pas d'informations sur la capacité de calcul du périphérique.

Ce que vous devez faire est: p>

  1. Charger manuellement la bibliothèque CUDA (l'application n'est pas liée à Libcudua)
    • Si la bibliothèque n'existe pas, le pilote CUDA n'est pas installé LI> ul> li>
    • Trouvez des pointeurs aux fonctions nécessaires dans la bibliothèque li>
    • Utilisez API de pilote pour interroger des informations sur les GPU disponibles sur LI> ol>

      J'espère que ce code sera utile. Je l'ai testé sous Linux mais avec des modifications mineures, elle devrait également compiler sous Windows. P>

      $ ./a.out
      $ echo $?
      1
      


6 commentaires

Merci, cela commence à semblant prometteurs! Maintenant, le seul problème est que ce code comprend Cuda.h et mon objectif même consiste à compiler un tel petit morceau de code à Configuration-Time, à vérifier le matériel compatible et à avertir l'utilisateur si vous avez trouvé quelque chose d'utile. Il est donc supposé que la boîte à outils Cuda n'est pas installée sur la machine hôte. J'ai trouvé un cuda_drvapi_dynlink_cudu.h dans le SDK. Je suppose que la licence (qui doit être compatible LGPL).


Vous ne pouvez pas simplement expédier cette application en tant que binaire? Il peut être compilé avec juste C compilateur afin que vous n'alliez pas appuyer sur des problèmes d'incompatibilité CLI, tels que C ++ (CUDA Runtime API, nécessite un compilateur C ++, mais pas l'API de pilote CUDA). Je ne sais pas où l'obligation de compiler cette application à la configuration du temps vient de.


Non, je ne peux pas. Il s'agit d'un code Scientific HPC compilé sur à peu près tout le matériel des netbooks aux plus grands supercalculateurs. Un aspect important consiste à éviter une douzaine de messages d'erreur que l'utilisateur doit fonctionner (y compris sur la boîte à outils CUDA manquante) et avertir uniquement l'utilisateur s'il existe un périphérique pris en charge détecté à la configuration ou à l'exécution.


Ce que je voulais dire, c'est que vous ne pouvez pas expédier une application qui recherche des appareils CUDA en tant que binaire. Il peut être compilé avec GCC et travaillera sur n'importe quelle machine sans nécessiter de recompilation. Il suffit d'exécuter cette application de découverte lors de la configuration de l'étape.


Sous Windows 10, je n'avais pas besoin de cuda.h inclure et l'exemple ci-dessus a fonctionné.


(... Mais les types CureSult et Cudevice ont besoin de définir)



1
votes

J'ai résolu ce problème en utilisant et en reliant statiquement le SDK CUDA 6.0. Il produit une application qui fonctionne également sur une machine ne disposant pas de cartes NVIDIA ou de machines que le SDK n'est pas installé. Dans ce cas, il indiquera qu'il existe zéro périphérique CUDA capable.

Il existe un exemple dans les échantillons inclus avec le CUDA SDK Calld DeviceQuery - J'ai utilisé des extraits d'entre eux pour écrire le code suivant. Je décide si un CUDA capable de dispositifs sont présents et, dans l'affirmative, les capacités de calcul de la Higest: xxx


1 commentaires

Merci d'avoir partagé. Cela nécessite toutefois que le temps d'exécution CUDA soit disponible à la compilation, ce que je voulais à l'origine éviter. Ces jours-ci, cependant, Cuda est beaucoup plus largement disponible, les exigences originales ont donc changé et nous supposons maintenant que les utilisateurs savent qu'ils ont un GPU et qu'elles ont besoin de la boîte à outils Cuda pour l'utiliser.