@@ -45,17 +45,10 @@ int main(int argc, char *argv[])
4545 char * * pargv ;
4646
4747 /* Default */
48- int m = 0 ;
49- int N = 8 ;
50- int NB = 4 ;
51- int P = 1 ;
52- int KP = 1 ;
53- int KQ = 1 ;
54- int cores = -1 ;
55- int nb_gpus = 0 ;
56- int info = 0 ;
57-
58- while ((ch = getopt (argc , argv , "m:N:t:s:S:P:c:g:h" )) != -1 ) {
48+ int m = 0 , N = 8 , NB = 4 , P = 1 , KP = 1 , KQ = 1 ;
49+ int cores = -1 , nb_gpus = 0 , nb_avail_gpu = 0 , info = 0 , gpu_mask = 0xFF ;
50+
51+ while ((ch = getopt (argc , argv , "m:N:t:s:S:P:c:g:G:h" )) != -1 ) {
5952 switch (ch ) {
6053 case 'm' : m = atoi (optarg ); break ;
6154 case 'N' : N = atoi (optarg ); break ;
@@ -65,6 +58,7 @@ int main(int argc, char *argv[])
6558 case 'P' : P = atoi (optarg ); break ;
6659 case 'c' : cores = atoi (optarg ); break ;
6760 case 'g' : nb_gpus = atoi (optarg ); break ;
61+ case 'G' : gpu_mask = atoi (optarg ); break ;
6862 case '?' : case 'h' : default :
6963 fprintf (stderr ,
7064 "-m : initialize MPI_THREAD_MULTIPLE (default: 0/no)\n"
@@ -75,6 +69,7 @@ int main(int argc, char *argv[])
7569 "-P : rows (P) in the PxQ process grid (default: 1)\n"
7670 "-c : number of cores used (default: -1)\n"
7771 "-g : number of GPUs used (default: 0)\n"
72+ "-G : mask of the GPUs to be used (default: 0xff)"
7873 "-h : print this help message\n"
7974 "\n" );
8075 exit (1 );
@@ -102,16 +97,20 @@ int main(int argc, char *argv[])
10297 break ;
10398 }
10499 }
105-
106100#if defined(PARSEC_HAVE_DEV_CUDA_SUPPORT )
107101 extern char * * environ ;
108102 char * value ;
109103 if ( nb_gpus < 1 && 0 == rank ) {
110- fprintf (stderr , "Warning: if run on GPUs, please set --gpus= value bigger than 0\n" );
104+ fprintf (stderr , "Warning: if run on GPUs, please set -g value bigger than 0\n" );
111105 }
112106 asprintf (& value , "%d" , nb_gpus );
113107 parsec_setenv_mca_param ( "device_cuda_enabled" , value , & environ );
114- free (value );
108+ free (value ); value = NULL ;
109+ if ( 0xFF != gpu_mask ) {
110+ asprintf (& value , "%d" , gpu_mask );
111+ parsec_setenv_mca_param ("device_cuda_mask" , value , & environ );
112+ free (value ); value = NULL ;
113+ }
115114#endif
116115
117116 /* Initialize PaRSEC */
@@ -134,7 +133,7 @@ int main(int argc, char *argv[])
134133 }
135134 cores = nb_total_comp_threads ;
136135 }
137-
136+ nb_avail_gpu = parsec_context_query ( parsec , PARSEC_CONTEXT_QUERY_DEVICES , PARSEC_DEV_CUDA );
138137 /* initializing matrix structure */
139138 parsec_matrix_block_cyclic_t dcA ;
140139 parsec_matrix_block_cyclic_init (& dcA , PARSEC_MATRIX_DOUBLE , PARSEC_MATRIX_TILE ,
@@ -153,9 +152,9 @@ int main(int argc, char *argv[])
153152 /* Main routines */
154153 SYNC_TIME_START ();
155154 info = parsec_get_best_device_check (parsec , (parsec_tiled_matrix_t * )& dcA );
156- SYNC_TIME_PRINT (rank , ("Get_best_device" " \tN= %d NB= %d "
155+ SYNC_TIME_PRINT (rank , ("Get_best_device\tN= %d NB= %d "
157156 "PxQ= %d %d KPxKQ= %d %d cores= %d nb_gpus= %d\n" ,
158- N , NB , P , nodes / P , KP , KQ , cores , parsec_nb_devices - 2 ));
157+ N , NB , P , nodes / P , KP , KQ , cores , nb_avail_gpu ));
159158
160159 /* Check result */
161160 if ( 0 == rank && info != 0 ) {
0 commit comments