2010-11-16 35 views
2

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.

Répondre

1

Dans MS VS, ainsi que dans gcc et éventuellement d'autres compilateurs (mais pas dans celui référencé par votre lien "Multiply defined linker error"), inline implique static par défaut. Vous pouvez forcer une fonction à être extern en ligne, mais, à moins que vous le fassiez, le compilateur ne placera pas une définition externe de la fonction dans le fichier objet, ou le marquera comme pouvant être dupliqué en toute sécurité. CEPENDANT, nulle part dans la documentation ne dit que les fonctions CUDA __device__ sont effectivement déclarées en ligne (et donc statiques). La documentation indique que la fonction est "toujours insérée par défaut". Il y a une différence subtile.

+0

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. –