/* * Print all available counters for a given CUDA device to stdout. * * @param cuDev the CUDA device */ static void vt_cupti_showAllCounters(CUdevice cuDev) { CUptiResult cuptiErr = CUPTI_SUCCESS; CUpti_EventDomainID *domainId = NULL; uint32_t maxDomains = 0; uint32_t i; size_t size = 0; cuptiErr = cuptiDeviceGetNumEventDomains(cuDev, &maxDomains); CHECK_CUPTI_ERROR(cuptiErr, "cuptiDeviceGetNumEventDomains"); if(maxDomains == 0){ vt_cntl_msg(1, "[CUPTI] No domain is exposed by dev = %d\n", cuDev); return; } size = sizeof(CUpti_EventDomainID) * maxDomains; domainId = (CUpti_EventDomainID*)malloc(size); if(domainId == NULL){ vt_cntl_msg(1, "[CUPTI] Failed to allocate memory to domain ID"); return; } memset(domainId, 0, size); cuptiErr = cuptiDeviceEnumEventDomains(cuDev, &size, domainId); CHECK_CUPTI_ERROR(cuptiErr, "cuptiDeviceEnumEventDomains"); /* enum domains */ for(i = 0; i < maxDomains; i++) enumEvents(cuDev, domainId[i]); free(domainId); }
/* * Detect supported domains for specified device */ static int enumEventDomains( CUdevice dev, int deviceId ) { CUptiResult err = CUPTI_SUCCESS; CUpti_EventDomainID *domainId = NULL; uint32_t id = 0; size_t size = 0; device[deviceId].domainCount = 0; /* get number of domains for device dev */ err = (*cuptiDeviceGetNumEventDomainsPtr)( dev, &device[deviceId].domainCount ); CHECK_CUPTI_ERROR( err, "cuptiDeviceGetNumEventDomains" ); if ( device[deviceId].domainCount == 0 ) { printf( "No domain is exposed by dev = %d\n", dev ); return -1; } /* CuPTI domain struct */ size = sizeof ( CUpti_EventDomainID ) * device[deviceId].domainCount; domainId = ( CUpti_EventDomainID * ) malloc( size ); if ( domainId == NULL ) { perror( "malloc(): Failed to allocate memory to CuPTI domain ID" ); return -1; } memset( domainId, 0, size ); /* PAPI domain struct */ device[deviceId].domain = ( DomainData_t * ) malloc( sizeof ( DomainData_t ) * device[deviceId].domainCount ); if ( device[deviceId].domain == NULL ) { perror( "malloc(): Failed to allocate memory to PAPI domain struct" ); free(domainId); return -1; } /* Enumerates the event domains for a device dev */ err = (*cuptiDeviceEnumEventDomainsPtr)( dev, &size, domainId ); CHECK_CUPTI_ERROR( err, "cuptiDeviceEnumEventDomains" ); /* enum domains */ for ( id = 0; id < device[deviceId].domainCount; id++ ) { device[deviceId].domain[id].domainId = domainId[id]; /* query domain name */ size = PAPI_MIN_STR_LEN; #ifdef CUDA_4_0 err = cuptiEventDomainGetAttribute( dev, device[deviceId].domain[id]. domainId, CUPTI_EVENT_DOMAIN_ATTR_NAME, &size, ( void * ) device[deviceId]. domain[id].name ); CHECK_CUPTI_ERROR( err, "cuptiEventDomainGetAttribute" ); /* query num of events avaialble in the domain */ size = sizeof ( device[deviceId].domain[id].eventCount ); err = cuptiEventDomainGetAttribute( dev, device[deviceId].domain[id]. domainId, CUPTI_EVENT_DOMAIN_MAX_EVENTS, &size, ( void * ) &device[deviceId]. domain[id].eventCount ); CHECK_CUPTI_ERROR( err, "cuptiEventDomainGetAttribute" ); /* enumerate the events for the domain[id] on the device dev */ if ( 0 != enumEvents( dev, deviceId, id ) ) return -1; #else err = (*cuptiDeviceGetEventDomainAttributePtr)( dev, device[deviceId].domain[id].domainId, CUPTI_EVENT_DOMAIN_ATTR_NAME, &size, ( void * ) device[deviceId].domain[id].name ); CHECK_CUPTI_ERROR( err, "cuptiDeviceGetEventDomainAttribute" ); /* query num of events avaialble in the domain */ err = (*cuptiEventDomainGetNumEventsPtr)( device[deviceId].domain[id].domainId, &device[deviceId].domain[id].eventCount ); CHECK_CUPTI_ERROR( err, "cuptiEventDomainGetNumEvents" ); /* enumerate the events for the domain[id] on the device deviceId */ if ( 0 != enumEvents( deviceId, id ) ) return -1; #endif } totalDomainCount += device[deviceId].domainCount; free( domainId ); return 0; }