diff -Naur magma-2.0.2/include/auxiliary.h magma-2.0.2.new/include/auxiliary.h --- magma-2.0.2/include/auxiliary.h 2016-05-03 05:29:40.000000000 +0200 +++ magma-2.0.2.new/include/auxiliary.h 2016-06-12 21:33:09.397888777 +0200 @@ -19,7 +19,7 @@ // ======================================== // initialization -magma_int_t magma_init( void ); +magma_int_t magma_init( int nb_devices=0, magma_device_t *devices=NULL ); magma_int_t magma_finalize( void ); diff -Naur magma-2.0.2/interface_cuda/interface.cpp magma-2.0.2.new/interface_cuda/interface.cpp --- magma-2.0.2/interface_cuda/interface.cpp 2016-05-03 05:29:40.000000000 +0200 +++ magma-2.0.2.new/interface_cuda/interface.cpp 2016-06-12 22:04:50.112286768 +0200 @@ -138,6 +138,7 @@ }; static int g_magma_devices_cnt = 0; +static magma_device_t *g_magma_devices_ids = NULL; static struct magma_device_info* g_magma_devices = NULL; @@ -160,7 +161,7 @@ @ingroup magma_init */ extern "C" -magma_int_t magma_init() +magma_int_t magma_init( int nb_devices, magma_device_t *devices ) { magma_int_t info = 0; size_t size; @@ -172,13 +173,25 @@ cudaError_t err; g_magma_devices_cnt = 0; err = cudaGetDeviceCount( &g_magma_devices_cnt ); - if ( err != 0 && err != cudaErrorNoDevice ) { + if ( err != 0 && err != cudaErrorNoDevice && nb_devices>g_magma_devices_cnt) { info = MAGMA_ERR_UNKNOWN; goto cleanup; } - + if(nb_devices > 0){ + g_magma_devices_cnt = nb_devices; + } + size = g_magma_devices_cnt * sizeof(magma_device_t); + magma_malloc_cpu( (void**) &g_magma_devices_ids, size ); + + if(devices == NULL){ + magma_getdevices(g_magma_devices_ids, g_magma_devices_cnt, &nb_devices); + } else { + memcpy(g_magma_devices_ids, devices, g_magma_devices_cnt * sizeof(magma_device_t)); + } + magma_setdevice(0); + // allocate list of devices - size = max( 1, g_magma_devices_cnt ) * sizeof(struct magma_device_info); + size = g_magma_devices_cnt * sizeof(struct magma_device_info); magma_malloc_cpu( (void**) &g_magma_devices, size ); if ( g_magma_devices == NULL ) { info = MAGMA_ERR_HOST_ALLOC; @@ -189,7 +202,7 @@ // query each device for( int dev=0; dev < g_magma_devices_cnt; ++dev ) { cudaDeviceProp prop; - err = cudaGetDeviceProperties( &prop, dev ); + err = cudaGetDeviceProperties( &prop, g_magma_devices_ids[dev] ); if ( err != 0 ) { info = MAGMA_ERR_UNKNOWN; } @@ -287,6 +300,11 @@ g_magma_devices = NULL; } + if ( g_magma_devices_ids != NULL ) { + magma_free_cpu( g_magma_devices_ids ); + g_magma_devices_ids = NULL; + } + #ifndef MAGMA_NO_V1 if ( g_null_queues != NULL ) { for( int dev=0; dev < g_magma_devices_cnt; ++dev ) { @@ -448,8 +466,15 @@ void magma_getdevice( magma_device_t* device ) { cudaError_t err; - err = cudaGetDevice( device ); + int cdevice=0; + err = cudaGetDevice( &cdevice ); check_error( err ); + *device=0; + while( ((*device) < g_magma_devices_cnt) && (g_magma_devices_ids[*device] != cdevice) ){ + (*device)++; + } + if((*device) == g_magma_devices_cnt) + (*device)=-1; } // -------------------- @@ -457,7 +482,7 @@ void magma_setdevice( magma_device_t device ) { cudaError_t err; - err = cudaSetDevice( device ); + err = cudaSetDevice( g_magma_devices_ids[device] ); check_error( err ); }