2010-04-17 14 views

Répondre

7

Oui le dispositif GPU doit être explicitement ou celui par défaut sera utilisé (dispositif 0 habituellement)

Gardez à l'esprit qu'une fois que l'exécution commence à utiliser un appareil toutes les fonctions appelées dans le même fil sera épinglé à cet appareil.

Quelque chose que je trouve utile à partir d'un fil est

cudaThreadExit(); // clears all the runtime state for the current thread 
cudaSetDevice(deviceId); // explicit set the current device for the other calls 
cudaMalloc 
cudaMemcpy 
etc.. 

Le guide de programmation a un chapitre consacré.

+0

désolé mais vous avez tort. Jetez un oeil à ma réponse à la place. – jopasserat

+0

@fabrizioM De quel chapitre s'agit-il? – syntagma

5

Cela dépend du mode dans lequel les GPU sont définis.

Appelez nvidia-smi -q pour trouver le Compute Mode de votre GPU. Selon la version du framework CUDA que vous utilisez, la sortie sera différente.

Fondamentalement, le mode par défaut est défini pour les GPU. Il permet à plusieurs contextes de fonctionner alternativement sur le même GPU. Cependant, chaque contexte doit explicitement libérer le GPU: alors qu'un contexte possède le GPU, les autres sont bloqués pendant une courte période, puis tués après un timeout.

Pour contourner cette limitation, vous pouvez appeler nvidia-smi -c avec une de cette valeur explicite, en fonction de vos besoins:

  • DÉFAUT
  • EXCLUSIVE_THREAD
  • INTERDITE
  • EXCLUSIVE_PROCESS
1

Oui, les périphériques GPU doivent être définis explicitement.

Une stratégie simple consisterait à régler tous les GPU à EXCLUSIVE_THREAD (comme indiqué par jopasserat). Un thread parcourrait tous les GPU disponibles et essayerait de récupérer un GPU gratuit jusqu'à ce qu'il réussisse. Le même mécanisme fonctionnerait correctement dans le cas de EXCLUSIVE_PROCESS.

Voir 3.4 compute modes dans la documentation de la boîte à outils cuda.