/* * Setup a list of devices with different device capabilities and add the * metrics, which are specified by the user. * * @return a list of CUDA devices with different device capabilities */ static vt_cupti_device_t* vt_cuptievt_setupMetricList(void) { CUresult err; int deviceCount, id; vt_cupti_device_t *capList = NULL; VT_SUSPEND_MALLOC_TRACING(VT_CURRENT_THREAD); /* CUDA initialization */ VT_CUDRV_CALL(cuInit(0), "cuInit"); /* How many GPGPU devices do we have? */ err = cuDeviceGetCount( &deviceCount ); VT_CUDRV_CALL(err, "cuDeviceGetCount"); if(deviceCount == 0){ vt_error_msg("[CUPTI Events] There is no device supporting CUDA available."); } /* create list with available compute capabilities */ for(id = 0; id < deviceCount; id++){ CUdevice cuDev; vt_cupti_device_t *cuptiDev; int dev_major, dev_minor; err = cuDeviceGet(&cuDev, id); VT_CUDRV_CALL(err, "cuDeviceGet"); err = cuDeviceComputeCapability(&dev_major, &dev_minor, cuDev); VT_CUDRV_CALL(err, "cuDeviceComputeCapability"); /* check if device capability already listed */ cuptiDev = vt_cupti_checkMetricList(capList, dev_major, dev_minor); if(cuptiDev == NULL){ /* allocate memory for device list entry */ cuptiDev = (vt_cupti_device_t *)malloc(sizeof(vt_cupti_device_t)); cuptiDev->dev_major = dev_major; cuptiDev->dev_minor = dev_minor; cuptiDev->cuDev = cuDev; cuptiDev->vtcuptiEvtList = NULL; cuptiDev->evtNum = 0; cuptiDev->next = NULL; /* prepend to list */ cuptiDev->next = capList; capList = cuptiDev; } } vt_cupti_fillMetricList(capList); /* cleanup list: remove entries, which don't have metrics */ { vt_cupti_device_t *curr = capList; vt_cupti_device_t *last = capList; while(curr != NULL){ vt_cupti_device_t *freeDev = curr; curr = curr->next; if(freeDev->evtNum == 0){ /* first element */ if(freeDev == capList){ capList = capList->next; }else{ last->next = freeDev->next; } free(freeDev); }else last = freeDev; } } VT_RESUME_MALLOC_TRACING(VT_CURRENT_THREAD); return capList; }
static vt_cupti_dev_t* vt_cupti_setupMetricList(void) { CUresult err; int deviceCount, id; vt_cupti_dev_t *capList = NULL; /* CUDA initialization */ err = cuInit( 0 ); if ( err != CUDA_SUCCESS ) { printf( "Initialization of CUDA library failed.\n" ); exit( EXIT_FAILURE ); } /* How many gpgpu devices do we have? */ err = cuDeviceGetCount( &deviceCount ); CHECK_CU_ERROR(err, "cuDeviceGetCount"); if(deviceCount == 0){ printf("[CUPTI]There is no device supporting CUDA.\n"); exit(EXIT_FAILURE); } /* create list with available compute capabilities */ for(id = 0; id < deviceCount; id++){ CUdevice cuDev; vt_cupti_dev_t *cuptiDev; int dev_major, dev_minor; err = cuDeviceGet(&cuDev, id); CHECK_CU_ERROR(err, "cuDeviceGet"); err = cuDeviceComputeCapability(&dev_major, &dev_minor, cuDev); CHECK_CU_ERROR(err, "cuDeviceComputeCapability"); /* check if device capability already listed */ cuptiDev = vt_cupti_checkMetricList(capList, dev_major, dev_minor); if(cuptiDev == NULL){ /* allocate memory for device list entry */ cuptiDev = (vt_cupti_dev_t *)malloc(sizeof(vt_cupti_dev_t)); cuptiDev->dev_major = dev_major; cuptiDev->dev_minor = dev_minor; cuptiDev->cuDev = cuDev; cuptiDev->vtcuptiEvtList = NULL; cuptiDev->evtNum = 0; cuptiDev->next = NULL; /* prepend to list */ cuptiDev->next = capList; capList = cuptiDev; } } vt_cupti_fillMetricList(capList); /* cleanup list: remove entries, which don't have metrics */ { vt_cupti_dev_t *curr = capList; vt_cupti_dev_t *last = capList; while(curr != NULL){ vt_cupti_dev_t *freeDev = curr; curr = curr->next; if(freeDev->evtNum == 0){ /* first element */ if(freeDev == capList){ capList = capList->next; }else{ last->next = freeDev->next; } free(freeDev); }else last = freeDev; } } return capList; }