Comment CUDA attribuer des Identifiants de l'appareil pour les Gpu?
Lorsqu'un ordinateur a plusieurs CUDA compatible Gpu, chaque GPU est affecté à une device ID
. Par défaut, les noyaux CUDA exécuter sur device ID 0
. Vous pouvez utiliser cudaSetDevice(int device)
pour sélectionner un autre périphérique.
Disons que j'ai deux Gpu sur ma machine: une GTX 480 et GTX 670. Comment CUDA décider quel GPU est device ID 0
et dont le GPU est device ID 1
?
D'idées pour CUDA peut attribuer des Identifiants de l'appareil (seulement remue-méninges):
- ordre décroissant de calculer la capacité de
- Numéro de logement PCI
- date/heure lorsque le dispositif a été ajouté au système (appareil qui vient d'être ajouté à l'ordinateur est plus un numéro d'identification)
Motivation: je travaille sur quelques HPC algorithmes, et je suis d'analyse comparative et de réglage automatique de plusieurs Gpu. Mon processeur est assez voies PCIe pour lecteur cudaMemcpys à 3 Gpu en pleine largeur de bande. Donc, au lieu de constamment à la permutation de Gpu dans et hors de ma machine, je suis tout simplement l'intention de garder 3 Gpu dans mon ordinateur. J'aimerais être capable de prédire ce qui va se passer quand je ajouter ou de remplacer certains Gpu dans l'ordinateur.
OriginalL'auteur solvingPuzzles | 2012-12-08
Vous devez vous connecter pour publier un commentaire.
CUDA choisit la manière la plus rapide de l'appareil en tant que périphérique 0. Ainsi, lorsque vous échangez des Gpu dans et hors de la commande peut changer complètement. Il pourrait être préférable de choisir Gpu basé sur leurs bus PCI id à l'aide de:
ou CUDA Driver API
cuDeviceGetByPCIBusId
cuDeviceGetPCIBusId
.Mais IMO le moyen le plus fiable de savoir quel appareil qui serait d'utiliser NVML ou nvidia-smi pour obtenir à chaque appareil d'identifiant unique (UUID) à l'aide de
nvmlDeviceGetUUID
et puis le match ne CUDA appareil avec pciBusId à l'aide denvmlDeviceGetPciInfo
.Certaines heuristiques sont utilisées pour estimer la vitesse théorique de la GPU. Ils prennent en compte, par exemple, architecture de processeur, vitesse d'horloge, le modèle de pilote (windows STC est ouve).
Pour le moment, j'ai 3 CUDA compatible Gpu dans ma machine: une GTX680, un GTX9800 (une ancienne, lente GPU que je viens d'utiliser pour la carte graphique), et un C2050. Curieusement, le GTX9800 obtient un nombre inférieur au C2050... étrange.
Seul GPU avec l'index 0 est le plus rapide. Reste de l'index ne sont pas classés par vitesse. Ne GTX 9800 a l'index 0? Si non, alors tout fonctionne comme prévu.
Nope, le GTX9800 n'a pas l'index 0. Il fait plus de sens maintenant.
OriginalL'auteur Przemyslaw Zych
Définir la variable d'environnement
CUDA_DEVICE_ORDER
:Puis le GPU Id sera commandé par le bus pci Id.
nvidia-smi
sortie de! IMO c'est un must pour l'apprentissage de la machine sur un multi-gpu de la machine.OriginalL'auteur Liang Xiao
La La prise en charge CUDA/Choix d'un GPU suggèrent que
Aussi, la discussion à Pas de GPU sélectionné, le code fonctionne correctement, comment est-ce possible? suggère que CUDA n'est pas une carte de la "meilleure" carte de périphérique 0 en général.
MODIFIER
Aujourd'hui, j'ai installé un PC avec une Tesla C2050 carte pour le calcul et un 8084 carte de GS pour la visualisation de la commutation de leur position entre les deux premiers slots PCI-E. J'ai utilisé deviceQuery et a remarqué que le GPU
0
est toujours que, dans le premier slot PCI et GPU1
est toujours que, dans le second slot PCI. Je ne sais pas si c'est une déclaration générale, mais c'est une preuve que pour mon système, les Gpu sont numérotées pas en fonction de leur "puissance", mais en fonction de leurs positions.OriginalL'auteur JackOLantern