CUDA: Comment utilisez -d'arc et de et de code SM vs CALCULER
Je ne suis toujours pas sûr de la façon de bien spécifier les architectures pour la génération de code lors de la construction avec nvcc. Je suis conscient qu'il est du code machine ainsi que PTX code incorporé dans mon binaire et que cela peut être contrôlée par le régulateur se met en -code
et -arch
(ou une combinaison des deux à l'aide de -gencode
).
Maintenant, selon cette outre les deux drapeaux de compilation il y a aussi deux manières de spécifier les architectures: sm_XX
et compute_XX
, où compute_XX
se réfère à un virtuel et sm_XX
à une véritable architecture. Le drapeau -arch
ne prend que des identificateurs pour les architectures virtuelles (comme compute_XX
) alors que le -code
indicateur prend à la fois, les identifiants pour de vrai et pour des architectures virtuelles.
La documentation indique que les -arch
spécifie les architectures virtuelles pour lesquelles les fichiers d'entrée sont compilés. Cependant, cette PTX code n'est pas automatiquement compilé en code machine, mais c'est plutôt un "prétraitement".
Maintenant, -code
est censé pour spécifier les architectures de la PTX code est assemblé et optimisé pour l'.
Cependant, il n'est pas clair qui PTX ou code binaire sera intégré dans le binaire. Si je spécifie par exemple -arch=compute_30 -code=sm_52
, cela veut-il dire que mon code sera d'abord compilé en fonction du niveau 3.0 PTX de qui par la suite s'en code machine pour le niveau de fonctionnalité 5.2) sera créé? Et ce sera intégrée?
Si je viens de le préciser -code=sm_52
ce qui va se passer ensuite? Seulement en code machine pour V5.2 sera intégré qui a été créé à partir de V5.2 PTX code? Et quelle serait la différence de -code=compute_52
?
OriginalL'auteur bweber | 2016-02-26
Vous devez vous connecter pour publier un commentaire.
Quelques questions/réponses sont ici et ici.
Une description complète est un peu compliqué, mais il y a de prévu pour être relativement simple, facile à retenir canonique usages. Compiler pour l'architecture (à la fois virtuel et réel), qui représente le Gpu que vous voulez cibler. Assez simple formulaire est:
où XX est le à deux chiffres de calculer la capacité pour le GPU que vous voulez cibler. Si vous souhaitez cibler plusieurs Gpu, il suffit de répéter la totalité de la séquence pour chaque XX cible. C'est environ l'approche adoptée avec le CUDA de l'échantillon de projets de code. (Si vous souhaitez inclure PTX dans votre exécutable, incluent un
-gencode
avec lecode
option spécifiant le même PTX architecture virtuelle comme learch
option).Un autre assez simple, lorsque cibler un seul GPU, c'est juste pour utiliser:
avec la même description pour XX. Ce formulaire comprend à la fois SASS et PTX pour l'architecture spécifiée.
Qui est fondamentalement correcte lors de la
arch
etcode
sont utilisés comme sous-interrupteurs à l'intérieur du-gencode
commutateur, ou si les deux sont utilisés ensemble, autonome comme vous le décrivez. Mais, par exemple, lorsque-arch
est utilisé par lui-même (sans-code
), il représente une autre sorte de "raccourci" de la notation, et dans ce cas, vous pouvez passer une architecture réelle, par exemple-arch=sm_52
La définition exacte de ce qui est incorporé varie en fonction de la forme de l'utilisation. Mais pour cet exemple:
ou pour l'équivalent de cas de vous identifier:
alors oui, cela signifie que:
ptxas
outil va générer cc5.2-conforme SASS code.(Je ne sais pas pourquoi vous auriez fait de spécifier un tel combo, mais c'est légal.)
-code=sm_52
va générer cc5.2 SASS du code à partir d'un intermédiaire de PTX code. Le SASS code sera intégré, le PTX seront rejetées. Notez que le choix de cette option par lui-même dans cette forme, sans-arch
option, serait illégale. (1)-code=compute_52
va générer cc5.x PTX code (uniquement) et l'incorporer à la PTX dans l'exécutable/binaire. Notez que le choix de cette option par lui-même dans cette forme, sans-arch
option, serait illégale. (1)La
cuobjdump
outil peut être utilisé pour identifier les composants sont exactement dans une donnée binaire.(1) Lorsque aucune
-gencode
commutateur est utilisé, et pas de-arch
commutateur est utilisé,nvcc
suppose un défaut-arch=sm_20
est ajouté à votre commande compile (c'est pour CUDA 7.5, la valeur par défaut-arch
paramètre peut varier en version CUDA).sm_20
est un réel de l'architecture, et il n'est pas légal pour spécifier un réel de l'architecture sur le-arch
option lorsqu'un-code
option est également fourni.cuobjdump --dump-ptx
etcuobjdump --dump-sass
pour connaître les versions de SASS (binaire en code machine) et PTX (architecture intermédiaire agnostique code) ont été émises dans le fichier objet. Je recommanderais que les mains sur l'approche à d'autres. Dans la pratique, pour générer un exécutable avec le soutien de plusieurs architectures, vous souhaitez inclure SASS pour chacune de ces architectures, plus PTX seulement pour le plus récente de l'architecture (pour la compilation JIT sur le potentiel futur Gpu).Ok, donc si je comprends bien: Si je voulais intégrer le code machine pour toutes les architectures et PTX code pour le dernier calcul de la capacité de seulement, je pouvais faire quelque chose comme ceci:
-gencode arch=compute_20,code=sm_20 [...] -gencode arch=compute_53,code=sm_53 -gencode arch=compute_53,code=compute_53
? Si seulement-code
une incidence sur ce que sera intégré!?Oui, quelque chose comme ça devrait fonctionner. Comme je l'ai dit, c'est plus ou moins ce que l'échantillon de projets. Vous voudrez peut-être jeter un oeil à la façon dont les makefiles ou VS les projets sont mis en place.
OriginalL'auteur Robert Crovella