2015-03-09 1 views
2

Par exemple, j'ai 2 GPU et 2 threads hôte. Je ne peux pas vérifier parce que PC multigpu est loin de moi. Je veux que le premier thread hôte fonctionne avec le premier GPU et le deuxième thread hôte avec le second GPU. Tous les threads hôtes sont constitués de nombreux appels cublas. Donc, est-il possible de choisir le premier GPU du premier thread hôte et le deuxième GPU du deuxième thread hôte par appel cudaSetDevice()?Des threads différents peuvent-ils définir différents GPU en tant que leur périphérique CUDA actuel?

Par exemple pour le deuxième thread hôte, j'appellerai cudaSetDevice(1), et pour le premier thread j'appellerai cudaSetDevice(0).

Répondre

2

Alors est-il possible de choisir le premier GPU du premier thread hôte et le second gpu du second thread hôte par un appel cudaSetDevice()?

Oui, c'est possible. Un exemple est donné dans le cudaOpenMPsample code pour ce type d'utilisation, (extrayant):

.... 
omp_set_num_threads(num_gpus); // create as many CPU threads as there are CUDA devices 
//omp_set_num_threads(2*num_gpus);// create twice as many CPU threads as there are CUDA devices 
#pragma omp parallel 
{ 
    unsigned int cpu_thread_id = omp_get_thread_num(); 
    unsigned int num_cpu_threads = omp_get_num_threads(); 

    // set and check the CUDA device for this CPU thread 
    int gpu_id = -1; 
--> checkCudaErrors(cudaSetDevice(cpu_thread_id % num_gpus)); // "% num_gpus" allows more CPU threads than GPU devices 
    ..., 
+0

Comment puis-je obtenir un entier non signé statiquement associé au fil que j'ai sur mon CPU? Si j'appelle GetCurrentProcessorNumber() j'obtiens des nombres non constants. – jimifiki

+0

Cela dépend du modèle de thread que vous utilisez. Si vous utilisez OpenMP, 'omp_get_thread_num()' retournera un identifiant unique de 0 .. (# threads-1), pour chaque thread dont OMP est conscient. –