Cette question est très liée à:erreurs Linker 2005 et 1169 (symboles se multiplient définis) lors de l'utilisation des fonctions de CUDA (devrait être en ligne par défaut)
A) How to separate CUDA code into multiple files
B) Link error LNK2005 when trying to compile several CUDA files together
Suivant les conseils d'ici: https://meta.stackexchange.com/questions/42343/same-question-but-not-quite et ici https://meta.stackexchange.com/questions/8910/asking-a-similar-but-not-the-same-question
Je demande un ver y question similaire mais je veux être absolument clair sur où est la différence entre ma question et les questions liées ci-dessus. Je recevais les erreurs d'éditeur de liens du titre en incluant un fichier d'en-tête, qui contenait la définition d'une fonction __device__
, dans plusieurs fichiers source.
Ceci est différent de lien A) où les mêmes erreurs se produisent avec __kernel__
fonctions parce __device__
selon le manuel CUDA implique inline
:
Dans le code de l'appareil compilé pour les périphériques de calcul 1.x capacité, un
__device__
La fonction est toujours insérée par défaut. Le qualificateur de fonction__noinline__
peut cependant être utilisé comme indication pour le compilateur de ne pas aligner la fonction si possible (voir Section E.1).
Lien B) est plus liée (et une réponse précise à juste titre qu'il ne semble pas s'inline, peu importe ce que dit le manuel), mais le lien B) fait référence à un en-tête expédié par NVIDIA plutôt que d'un propre en-tête si Bien que le problème soit probablement lié à mon fichier d'en-tête, il est très improbable qu'il se trouve dans un fichier d'en-tête NVIDIA. En d'autres termes, il est probable que le lien B) et mes questions ont des réponses différentes. En même temps, j'ai découvert que déclarer une fonction comme __device__ inline
résout le problème de sorte que ce qui précède est seulement pour documenter la solution pour le reste du monde.
La question ouverte est la raison de ce comportement.
explications possibles je suis venu avec:
- Le manuel est erroné
nvcc -arch=compute_11
ne sont pas admissibles comme « la compilation pour les dispositifs de calcul 1.x capacité » ou il y a un bogue dans nvcc- Ceci est spécifique MS-VS et fonctionne sur des plates-formes testées par NVIDIA
- J'ai une idée fausse sévère sur la façon dont
inline
fonctionne. Un exemple non cuda lié ca ne trouve ici: Multiply defined linker error using inlined functions Ma compréhension est celle exprimée par "caf" là-bas que "le compilateur ne devrait pas générer une définition externe de la fonction, donc il ne devrait pas déranger l'éditeur de liens" d'autres là-bas semblait être en désaccord.
Je serais grandement reconnaissant si quelqu'un avec plus d'efforts pourrait clarifier ce qui se passe ici.
Merci beaucoup. Comme il s'agit d'un code écrit à l'origine pour linux que j'ai téléchargé, je suppose que cela a fonctionné pour l'uploader original, de sorte qu'il pourrait y avoir des différences entre MSVS et gcc, mais je reconnais que j'ai mal lu la documentation ici. –