web-dev-qa-db-fra.com

Comment sélectionner le GPU sur lequel exécuter un travail?

Dans un ordinateur multi-GPU, comment désigner le GPU sur lequel un travail CUDA doit être exécuté?

Par exemple, lors de l’installation de CUDA, j’ai choisi d’installer le NVIDIA_CUDA-<#.#>_Samples puis d’exécuter plusieurs instances de la simulation nbody, mais elles ont toutes été exécutées sur un même GPU 0; Le processeur graphique 1 était complètement inactif (surveillé à l'aide de watch -n 1 nvidia-dmi). Vérification de CUDA_VISIBLE_DEVICES en utilisant

echo $CUDA_VISIBLE_DEVICES

J'ai trouvé que ce n'était pas réglé. J'ai essayé de le mettre en utilisant

CUDA_VISIBLE_DEVICES=1

puis en exécutant à nouveau nbody, mais il est également passé à GPU 0.

J'ai examiné la question connexe, comment choisir un GPU désigné pour exécuter le programme CUDA? , mais la commande deviceQuery ne se trouve pas dans le répertoire bin de CUDA 8.0. En plus de $CUDA_VISIBLE_DEVICES$, d’autres publications font référence à la variable d’environnement $CUDA_DEVICES, mais elles n’ont pas été définies et je n’ai pas trouvé d’informations sur son utilisation.

Bien que cela ne soit pas directement lié à ma question, en utilisant nbody -device=1, j’ai pu exécuter l’application sur le GPU 1, mais en utilisant nbody -numdevices=2 ne s’était pas exécuté sur les GPU 0 et 1.

Je teste cela sur un système fonctionnant avec le shell bash, sur CentOS 6.8, avec les GPU CUDA 8.0, 2 GTX 1080 et le pilote NVIDIA 367.44.

Je sais que lorsque vous écrivez avec CUDA, vous pouvez gérer et contrôler les ressources CUDA à utiliser, mais comment gérer cela à partir de la ligne de commande lorsque vous exécutez un exécutable CUDA compilé?

38
Steven C. Howell

Le problème est dû au fait que la variable CUDA_VISIBLE_DEVICES n'a pas été définie correctement dans le shell.

Pour spécifier un périphérique CUDA 1 par exemple, vous devez définir le CUDA_VISIBLE_DEVICES à l'aide de

export CUDA_VISIBLE_DEVICES=1

ou

CUDA_VISIBLE_DEVICES=1 ./cuda_executable

Le premier définit la variable pour la vie du shell actuel, le dernier uniquement pour la durée de cette invocation exécutable particulière.

Si vous souhaitez spécifier plusieurs périphériques, utilisez

export CUDA_VISIBLE_DEVICES=0,1

ou

CUDA_VISIBLE_DEVICES=0,1 ./cuda_executable
68
Steven C. Howell