CUDA: non valide appareil ordinale
J'ai le problème suivant. Je veux permettre à mes utilisateurs de choisir les GPU pour exécuter sur. Donc j'ai été le tester sur ma machine qui n'a qu'un seul GPU (périphérique 0) ce qui arriverait si ils choisissent un appareil qui n'existe pas.
Si je ne cudaSetDevice(0);
cela fonctionnera très bien.
Si je fais: cudaSetDevice(1);
il va se planter avec invalid device ordinal
(je peux gérer ce que la fonction renvoie une erreur).
Si je fais: cudaSetDevice(0); cudaSetDevice(1);
il va se planter avec invalid device ordinal
(je peux gérer ce que la fonction renvoie une erreur).
Toutefois! Si je fais: cudaSetDevice(1); cudaSetDevice(0);
la deuxième commande renvoie succès mais sur le premier calcul j'ai essayer de calculer sur mon GPU il va se planter avec invalid device ordinal
. Je ne peut pas gérer ce que la deuxième commande ne retourne pas une erreur!
Il me semble que la première cudaSetDevice laisse un peu traîner, ce qui affecte le deuxième commandement?
Merci beaucoup!
Solution: (Merci à Robert Crovella!).
J'ai été à traiter les erreurs comme:
error = cudaSetDevice(1);
if (error) { blabla }
Mais apparemment, vous avez besoin d'appeler cudaGetLastError() après le cudaSetDevice(1) parce que sinon, le message d'erreur n'est pas supprimé de certains pile d'erreur et il se bloque plus tard, où je faisais cudaGetLastError() pour une autre fonction, même si il n'y a pas d'erreur à ce stade.
Vous devez vous connecter pour publier un commentaire.
Vous avez pour vérifier le nombre de GPU sont disponibles dans votre système d'abord. Il est possible par l'utilisation de
cudaGetDeviceCount
.De vérifier ensuite si la saisie de l'utilisateur est supérieure à la périphériques disponibles.
Rappeler que
cudaSetDevice
est de 0 basée sur des indices! À cet effet, je checkuserDeviceInput < deviceCount
.cudaPeekAtLastError()
qui n' pas effacer le code d'erreur. Il retourne la dernière erreur à chaque fois que vous demandez pour elle (comme après votre noyau à lancer). Au lieu de cela,cudaGetLastError()
va effacer le message d'erreur qu'il est rentré (c'est à dire un avenir case ne renvoie plus d'erreur, il sera de retourcudaSuccess
si pas de nouvelles erreurs se produisent). Ce qui est différent de l'API de renvoyer le code d'erreur. Si vous souhaitez que le noyau de lancement à ne pas, necudaGetLastError
quelque part avant, mais après le illégalescudaSetDevice(1)
appel.cudaPeekAtLastError
. Le manque de croustillant exemple dans votre question, il est difficile pour quiconque de réponse.