2017-10-19 36 views
0

Je construis OpenCV avec le support gpu avec succès depuis un moment maintenant, cependant, j'ai rencontré une situation que je n'arrive pas à résoudre. Après avoir construit OpenCV 3.3 avec VS 2013 et CUDA 8.0, l'OpenCV cpu et gpu semble fonctionner correctement sur quelques-unes de mes machines de test GTX 750 Ti et GTX 950M (toutes deux avec Windows 10). Sur une autre machine avec un GTX 1050 Ti, les appels de cpu fonctionnent, mais je reçois une "fonction d'appareil invalide" sur mon premier appel de fonction OpenCV-cuda. Dans CMake, j'ai manipulé les variables CUDA_ARCH_BIN et CUDA_GENERATION et les ai reconstruites, mais je n'arrive pas à trouver une solution pour cette machine. J'ai mis à jour le pilote graphique NVidia, essayé CUDA_ARCH_BIN à 3.0.3.5,3.7,5.0, et CUDA_GENERATION à Kepler, Maxwell, et vide. Tous travaillent sur deux des machines de test, et échouent avec la même erreur sur le troisième. Tout ce que j'ai trouvé sur le web indique que cela est dû à une incompatibilité entre la capacité de calcul du GPU et le paramètre CUDA_ARCH_BIN. Je pense que si je me mets à 5.0/Maxwell, ça fonctionnerait sur Maxwell, Pascals, et plus récent. La seule autre variable est que le 1050 Ti fonctionne sur une machine Windows 7, et je prie pour que ce ne soit pas le problème. Ou peut-être qu'il y a une incompatibilité entre VS2013, Cuda 8.0 et/ou OpenCV 3.3? Toutes les idées seraient grandement appréciées.OpenCV Cuda "fonction de périphérique invalide" sur le premier appel cuda

+2

Je suggère d'ajouter arc 6.1/Pascal pour le dispositif Pascal 1050 –

+0

@RobertCrovella il me vint que je rédigeais cette question que ce pourrait être le problème. Je penserais que mettre CUDA_ARCH_BIN à 3.0, 3.2, 3.5, 3.7, 5.0, 5.2 fonctionnerait sur une carte 6.1. Je suppose que peut-être * chaque * capacité de calcul que vous voulez couvrir doit être dans la liste? Quoi qu'il en soit ... construire maintenant et rendra compte. –

+2

Cela dépend exactement comment cmake convertit ces entrées en commutateurs de compilation CUDA réels. Si cela spécifie l'inclusion de PTX, vous avez raison. Si ce n'est pas le cas, j'ai raison. Puisque l'erreur "fonction de périphérique invalide" est une indication assez concluante qu'aucun PTX approprié n'existe dans l'image construite, je suis enclin à croire que je suis correct, et conforme à votre propre déclaration: "Tout ce que j'ai trouvé sur le web dit que cela est causé par une discordance entre la capacité de calcul du GPU et le paramètre CUDA_ARCH_BIN " –

Répondre

1

Merci à @RobertCrovella pour avoir fourni la bonne réponse. Le problème a été résolu en ajoutant simplement 6.1 à la liste CUDA_ARCH_BIN dans CMAKE. Donc, ce que j'ai fini par utiliser était CUDA_ARCH_BIN = 5.0, 5.2, 6.0, 6.1 (puisque je ne suis intéressé que par Maxwell et Pascal) et j'ai quitté CUDA_GENERATION vide. Si vous sélectionnez quelque chose pour CUDA_GENERATION, cela remplit automatiquement CUDA_ARCH_BIN pour vous ... et pour moi, cela m'a donné plus que ce que je voulais. Remarque: J'ai remarqué que plus vous ajoutez d'architectures à CUDA_ARCH_BIN, plus les dll OpenCV sont grandes. Ce qui soutient exactement ce que Robert disait dans ses commentaires. Il semble que pour chaque architecture de la liste, le code spécifique à cette architecture est ajouté à la DLL. Si vous ne mettez pas d'arc dans la liste, le code ne sera pas exécuté sur cette arche.

Tout semble si évident maintenant.

Merci encore, Robert!

Pour les intéressés, voici mes CUDA paramètres de CMake:

enter image description here