Façon la plus simple de tester l'existence de cuda-GPU capable de cmake?
Nous avons certains soirs construire des machines qui ont le cuda bibliothèques installé, mais qui n'ont pas de cuda compatible GPU installé. Ces machines sont capables de construire compatible cuda programmes, mais ils ne sont pas capables de l'exécution de ces programmes.
Dans notre automatisé nightly build, nos cmake scripts utiliser la commande cmake
find_package(CUDA)
pour déterminer si le cuda logiciel est installé. Cela définit le cmake variable CUDA_FOUND
sur les plates-formes qui ont cuda logiciel installé. C'est grand et il fonctionne parfaitement. Lorsque CUDA_FOUND
est défini, il est OK pour construire compatible cuda programmes. Même lorsque la machine n'a pas de cuda compatible GPU.
Mais cuda-à l'aide de programmes de test naturellement échouer sur la non-GPU cuda machines, à l'origine de nos soirée tableaux de bord, look "sale". Donc, je veux cmake pour éviter l'exécution de ces tests sur ces machines. Mais j'ai encore envie de construire le cuda de logiciels sur ces machines.
Après l'obtention d'un positif CUDA_FOUND
résultat, je voudrais tester la présence d'un GPU, puis définir une variable, par exemple CUDA_GPU_FOUND
, pour en tenir compte.
Quelle est la façon la plus simple pour obtenir cmake pour tester la présence d'un cuda compatible gpu?
Ce besoin de travailler sur les trois plates-formes: Windows avec MSVC, Mac, et Linux. (C'est pourquoi nous utilisons cmake en premier lieu)
EDIT: Il ya un couple de bonne à la recherche de suggestions dans les réponses pour savoir comment écrire un programme pour tester la présence d'un GPU. Ce qui manque encore est le moyen d'accéder à CMake pour compiler et exécuter ce programme au moment de la configuration. Je soupçonne que le TRY_RUN
commande CMake sera critique ici, mais malheureusement, la commande est près de sans-papiers, et je ne peux pas comprendre comment le faire fonctionner. Cette CMake une partie du problème pourrait être beaucoup plus une question difficile. Peut-être que j'aurais demandé à ce que les deux questions distinctes...
OriginalL'auteur Christopher Bruns | 2010-02-17
Vous devez vous connecter pour publier un commentaire.
La réponse à cette question se compose de deux parties:
Pour la partie 1, le gpu renifler programme, j'ai commencé avec la réponse fournie par fabrizioM parce qu'il est si compact. J'ai rapidement découvert que j'avais besoin de beaucoup de détails qui se trouvent dans la réponse de l'inconnu pour qu'il fonctionne bien. Ce que j'ai est le suivant fichier source C, j'ai nommé
has_cuda_gpu.c
:Avis que le code de retour est nul dans les cas où un compatible cuda GPU est trouvé. C'est parce que l'un de mes a-cuda-mais-pas-GPU machines, ce programme génère une erreur d'exécution avec le code de sortie non nulle. Si aucun code de sortie non nulle est considérée comme "cuda ne fonctionne pas sur cette machine".
Vous pourriez vous demander pourquoi je n'ai pas utiliser cuda mode d'émulation sur la non-GPU machines. C'est parce que le mode d'émulation est buggé. Je ne veux debug mon code, et de travailler autour de bugs dans cuda GPU code. Je n'ai pas de temps à déboguer l'émulateur.
La deuxième partie du problème est le cmake code pour utiliser ce programme de test. Après quelques difficultés, j'ai pensé à elle. Le bloc suivant est partie d'un plus grand
CMakeLists.txt
fichier:Ce
CUDA_HAVE_GPU
variable booléenne dans cmake qui peut ensuite être utilisé pour déclencher des opérations conditionnelles.Il m'a fallu du temps pour comprendre que l'inclure et de lier des paramètres besoin d'aller dans le CMAKE_FLAGS couplet, et que la syntaxe devrait être. Le try_run documentation est très léger, mais il n'y a plus d'informations dans le try_compile documentation, qui est étroitement liée commande. J'ai encore besoin de parcourir le web pour les exemples de try_compile et try_run avant de se faire ce travail.
Un autre délicat, mais détail important est le troisième argument de
try_run
, le "bindir". Vous devriez toujours mettre cela à${CMAKE_BINARY_DIR}
. En particulier, ne le placez pas à${CMAKE_CURRENT_BINARY_DIR}
si vous êtes dans un sous-répertoire de votre projet. CMake s'attend à trouver le sous-répertoireCMakeFiles/CMakeTmp
dans bindir, et crache des erreurs si ce répertoire n'existe pas. Utilisez simplement${CMAKE_BINARY_DIR}
, qui est l'endroit où ces sous-répertoires semblent naturellement résident.OriginalL'auteur
Écrire un programme simple comme
et vérifier la valeur de retour.
OriginalL'auteur
Je viens d'écrire un pur script Python qui n'certaines des choses que vous semblez avoir besoin (j'ai pris beaucoup de ce à partir de la pystream projet). Il est fondamentalement juste un wrapper pour certaines fonctions dans le CUDA moment de l'exécution de la bibliothèque (il utilise ctypes). Regardez la fonction main() pour voir l'exemple d'utilisation. Aussi, sachez que je viens d'écrire, de sorte qu'il est susceptible de contenir des bugs. À utiliser avec prudence.
D'accord. Le DeviceProp classe peut avoir besoin d'être mis à jour avec chaque nouvelle CUDA runtime version.
J'obtiens une erreur: à l'exception de OSError, e: [SyntaxError: invalid syntaxe] en python 3.5
OriginalL'auteur
Vous pouvez compiler petit GPU programme de recherche si cuda a été trouvé. ici est simple, vous pouvez adopter les besoins:
pas de problème, malheureusement je ne sais pas cmake (j'utilise automake). gnu.org/software/hello/manual/autoconf/Runtime.html est un élément important de autoconf. Peut-être vous aider à trouver des correspondantes cmake fonction
OriginalL'auteur
Une approche utile est d'exécuter les programmes CUDA a installé, comme nvidia-pmi, pour voir ce qu'ils en retour.
On pourrait aussi s'interroger linux /proc ou lspci. Voir entièrement travaillé CMake exemple à https://github.com/gromacs/gromacs/blob/master/cmake/gmxDetectGpu.cmake
OriginalL'auteur