static int lua_likwid_finalize(lua_State* L) { if (topology_isInitialized == 1) { topology_finalize(); topology_isInitialized = 0; cputopo = NULL; cpuinfo = NULL; } if (numa_isInitialized == 1) { numa_finalize(); numa_isInitialized = 0; numainfo = NULL; } if (affinity_isInitialized == 1) { affinity_finalize(); affinity_isInitialized = 0; affinity = NULL; } if (perfmon_isInitialized == 1) { perfmon_finalize(); perfmon_isInitialized = 0; } if (config_isInitialized == 1) { destroy_configuration(); config_isInitialized = 0; configfile = NULL; } return 0; }
int test_affinityinit() { int i = 0; topology_init(); CpuTopology_t cputopo = get_cpuTopology(); numa_init(); affinity_init(); AffinityDomains_t doms = get_affinityDomains(); if (doms == NULL) goto fail; if (doms->numberOfSocketDomains != cputopo->numSockets) goto fail; if (doms->numberOfNumaDomains == 0) goto fail; if (doms->numberOfProcessorsPerSocket == 0) goto fail; if (doms->numberOfAffinityDomains == 0) goto fail; if (doms->numberOfCacheDomains == 0) goto fail; if (doms->numberOfCoresPerCache == 0) goto fail; if (doms->numberOfProcessorsPerCache == 0) goto fail; if (doms->numberOfProcessorsPerCache < doms->numberOfCoresPerCache) goto fail; if (doms->domains == NULL) goto fail; for (i = 0; i < doms->numberOfAffinityDomains; i++) { if (doms->domains[i].numberOfProcessors == 0) goto fail; if (doms->domains[i].numberOfCores == 0) goto fail; if (doms->domains[i].numberOfProcessors < doms->domains[i].numberOfCores) goto fail; if (doms->domains[i].processorList == NULL) goto fail; } affinity_finalize(); topology_finalize(); return 1; fail: affinity_finalize(); topology_finalize(); return 0; }
static int lua_likwid_putAffinityInfo(lua_State* L) { if (affinity_isInitialized) { affinity_finalize(); affinity_isInitialized = 0; affinity = NULL; } return 0; }
int test_perfmoninit_valid() { int cpu = 0; topology_init(); affinity_init(); int ret = perfmon_init(1, &cpu); if (ret != 0) goto fail; if (perfmon_getNumberOfGroups() != 0) goto fail; if (perfmon_getNumberOfThreads() != 1) goto fail; perfmon_finalize(); affinity_finalize(); topology_finalize(); return 1; fail: perfmon_finalize(); affinity_finalize(); topology_finalize(); return 0; }
int test_perfmoninit() { int cpu = 0; int i; topology_init(); affinity_init(); for(i=0;i<10;i++) { perfmon_init(1, &cpu); perfmon_finalize(); } affinity_finalize(); topology_finalize(); return 1; }
int test_perfmonperfgroup() { CpuInfo_t cpuinfo; int i; int cpu = 0; topology_init(); cpuinfo = get_cpuInfo(); int ret = perfmon_init(1, &cpu); if (ret != 0) { printf("Perfmon init failed\n"); goto fail; } char** glist = NULL; char** slist = NULL; char** llist = NULL; ret = perfmon_getGroups(&glist, &slist, &llist); if (ret <= 0) { goto fail; } ret = perfmon_addEventSet(glist[0]); if (ret != 0) { printf("Perfmon addEventSet(%s) failed\n", glist[0]); goto fail; } if (perfmon_getNumberOfEvents(ret) == 0) { printf("Perfmon number of events == 0\n"); goto fail; } if (perfmon_getNumberOfMetrics(ret) == 0) { printf("Perfmon number of metrics == 0\n"); goto fail; } for (i=0; i<perfmon_getNumberOfEvents(ret); i++) { if (strcmp(perfmon_getEventName(ret, i), "") == 0) goto fail; if (strcmp(perfmon_getCounterName(ret, i), "") == 0) goto fail; } if (strcmp(perfmon_getGroupName(ret), "Custom") == 0) { goto fail; } if (strcmp(perfmon_getGroupInfoShort(ret), "Custom") == 0) { goto fail; } if (strcmp(perfmon_getGroupInfoLong(ret), "Custom") == 0) { goto fail; } if (perfmon_getLastTimeOfGroup(ret) != 0) { goto fail; } if (perfmon_getTimeOfGroup(ret) != 0) { goto fail; } for (i=0; i<perfmon_getNumberOfMetrics(ret); i++) { if (strcmp(perfmon_getMetricName(ret, i), "") == 0) goto fail; if (perfmon_getMetric(ret, i, 0) != 0.0) goto fail; } free(glist); free(slist); free(llist); perfmon_finalize(); affinity_finalize(); topology_finalize(); return 1; fail: if (glist) free(glist); if (slist) free(slist); if (llist) free(llist); perfmon_finalize(); affinity_finalize(); topology_finalize(); return 0; }
int test_perfmoncustomgroup() { CpuInfo_t cpuinfo; int cpu = 0; topology_init(); cpuinfo = get_cpuInfo(); int ret = perfmon_init(1, &cpu); if (ret != 0) { printf("Perfmon init failed\n"); goto fail; } ret = perfmon_addEventSet(eventset_ok); if (ret != 0) { printf("Perfmon addEventSet(ok) failed\n"); goto fail; } if (perfmon_getNumberOfEvents(ret) != 3) { printf("Perfmon number of events != 3\n"); goto fail; } if (perfmon_getNumberOfMetrics(ret) != 0) { printf("Perfmon number of metrics != 0\n"); goto fail; } if (strcmp(perfmon_getEventName(ret, 0), event1_ok) != 0) { goto fail; } if (strcmp(perfmon_getEventName(ret, 1), event2_ok) != 0) { goto fail; } if (strcmp(perfmon_getEventName(ret, 2), event3_ok) != 0) { goto fail; } if (strcmp(perfmon_getCounterName(ret, 0), ctr1_ok) != 0) { goto fail; } if (strcmp(perfmon_getCounterName(ret, 1), ctr2_ok) != 0) { goto fail; } if (strcmp(perfmon_getCounterName(ret, 2), ctr3_ok) != 0) { goto fail; } if (strcmp(perfmon_getGroupName(ret), "Custom") != 0) { goto fail; } if (strcmp(perfmon_getGroupInfoShort(ret), "Custom") != 0) { goto fail; } if (strcmp(perfmon_getGroupInfoLong(ret), "Custom") != 0) { goto fail; } if (perfmon_getLastTimeOfGroup(ret) != 0) { goto fail; } perfmon_finalize(); affinity_finalize(); topology_finalize(); return 1; fail: perfmon_finalize(); affinity_finalize(); topology_finalize(); return 0; }
int test_perfmonaddeventset() { char eventset_fail1[] = "INSTR_RETIRED.ANY:FIXC0"; char eventset_fail2[] = "INSTR_RETIRED-ANY:FIXC0"; CpuInfo_t cpuinfo; int cpu = 0; topology_init(); cpuinfo = get_cpuInfo(); if (cpuinfo->isIntel == 0) { topology_finalize(); return 1; } int ret = perfmon_init(1, &cpu); if (ret != 0) { printf("Perfmon init failed\n"); goto fail; } if (perfmon_getNumberOfGroups() != 0) { printf("Perfmon number of groups != 0\n"); goto fail; } if (perfmon_getNumberOfThreads() != 1) { printf("Perfmon number of threads != 1\n"); goto fail; } if (perfmon_getIdOfActiveGroup() != -1) { printf("Perfmon id of active group != -1\n"); goto fail; } ret = perfmon_addEventSet(eventset_ok); if (ret != 0) { printf("Perfmon addEventSet(ok) failed\n"); goto fail; } if (perfmon_getNumberOfGroups() != 1) { printf("Perfmon number of groups != 1\n"); goto fail; } if (perfmon_getNumberOfEvents(ret) != 3) { printf("Perfmon number of events != 3\n"); goto fail; } if (perfmon_getIdOfActiveGroup() != -1) { printf("Perfmon id of active group != -1\n"); goto fail; } ret = perfmon_addEventSet(eventset_option); if (ret != 1) { printf("Perfmon addEventSet(options) failed\n"); goto fail; } if (perfmon_getNumberOfGroups() != 2) { printf("Perfmon number of groups != 2\n"); goto fail; } if (perfmon_getNumberOfEvents(ret) != 3) { printf("Perfmon number of events != 3\n"); goto fail; } if (perfmon_getIdOfActiveGroup() != -1) { printf("Perfmon id of active group != -1\n"); goto fail; } ret = perfmon_addEventSet(eventset_fail1); if (ret >= 0) { printf("Perfmon addEventSet(fail1) failed\n"); goto fail; } if (perfmon_getNumberOfGroups() != 2) { printf("Perfmon number of groups != 2\n"); goto fail; } ret = perfmon_addEventSet(eventset_fail2); if (ret >= 0) { printf("Perfmon addEventSet(fail2) failed\n"); goto fail; } if (perfmon_getNumberOfGroups() != 2) { printf("Perfmon number of groups != 2\n"); goto fail; } if (perfmon_getIdOfActiveGroup() != -1) { printf("Perfmon id of active group != -1\n"); goto fail; } perfmon_finalize(); affinity_finalize(); topology_finalize(); return 1; fail: perfmon_finalize(); affinity_finalize(); topology_finalize(); return 0; }
int main(int argn, char** argc) { int err, i ,j; int numCPUs = 0; int gid; DATATYPE *a,*b,*c,*d; TimeData timer; double triad_time, copy_time, scale_time, stream_time; char estr[1024]; double result, scalar = 3.0; char* ptr; if (argn != 3) { printf("Usage: %s <cpustr> <events>\n", argc[0]); return 1; } strcpy(estr, argc[2]); allocate_vector(&a, SIZE); allocate_vector(&b, SIZE); allocate_vector(&c, SIZE); allocate_vector(&d, SIZE); err = topology_init(); if (err < 0) { printf("Failed to initialize LIKWID's topology module\n"); return 1; } CpuTopology_t topo = get_cpuTopology(); affinity_init(); int* cpus = (int*)malloc(topo->numHWThreads * sizeof(int)); if (!cpus) return 1; numCPUs = cpustr_to_cpulist(argc[1], cpus, topo->numHWThreads); omp_set_num_threads(numCPUs); err = perfmon_init(numCPUs, cpus); if (err < 0) { printf("Failed to initialize LIKWID's performance monitoring module\n"); affinity_finalize(); topology_finalize(); return 1; } gid = perfmon_addEventSet(estr); if (gid < 0) { printf("Failed to add event string %s to LIKWID's performance monitoring module\n", estr); perfmon_finalize(); affinity_finalize(); topology_finalize(); return 1; } err = perfmon_setupCounters(gid); if (err < 0) { printf("Failed to setup group %d in LIKWID's performance monitoring module\n", gid); perfmon_finalize(); affinity_finalize(); topology_finalize(); return 1; } #ifdef _OPENMP printf(HLINE); #pragma omp parallel { #pragma omp master { printf ("Number of Threads requested = %i\n",omp_get_num_threads()); } likwid_pinThread(cpus[omp_get_thread_num()]); printf ("Thread %d running on processor %d ....\n",omp_get_thread_num(),sched_getcpu()); } #endif #pragma omp parallel for for (int j=0; j<SIZE; j++) { a[j] = 1.0; b[j] = 2.0; c[j] = 0.0; d[j] = 1.0; } err = perfmon_startCounters(); if (err < 0) { printf("Failed to start counters for group %d for thread %d\n",gid, (-1*err)-1); perfmon_finalize(); topology_finalize(); return 1; } time_start(&timer); #pragma omp parallel { for (int k=0; k<ITER; k++) { LIKWID_MARKER_START("copy"); #pragma omp for for (int j=0; j<SIZE; j++) { c[j] = a[j]; } LIKWID_MARKER_STOP("copy"); } } time_stop(&timer); err = perfmon_stopCounters(); copy_time = time_print(&timer)/(double)ITER; if (err < 0) { printf("Failed to stop counters for group %d for thread %d\n",gid, (-1*err)-1); perfmon_finalize(); topology_finalize(); return 1; } printf("Processed %.1f Mbyte at copy benchmark in %.4f seconds: %.2f MByte/s\n", 1E-6*(2*SIZE*sizeof(DATATYPE)), copy_time, 1E-6*((2*SIZE*sizeof(DATATYPE))/copy_time)); ptr = strtok(estr,","); j = 0; while (ptr != NULL) { for (i = 0;i < numCPUs; i++) { result = perfmon_getResult(gid, j, cpus[i]); printf("Measurement result for event set %s at CPU %d: %f\n", ptr, cpus[i], result); } ptr = strtok(NULL,","); j++; } strcpy(estr, argc[2]); perfmon_setupCounters(gid); err = perfmon_startCounters(); if (err < 0) { printf("Failed to start counters for group %d for thread %d\n",gid, (-1*err)-1); perfmon_finalize(); topology_finalize(); return 1; } time_start(&timer); #pragma omp parallel { for (int k=0; k<ITER; k++) { LIKWID_MARKER_START("scale"); #pragma omp for for (int j=0; j<SIZE; j++) { b[j] = scalar*c[j]; } LIKWID_MARKER_STOP("scale"); } } time_stop(&timer); err = perfmon_stopCounters(); scale_time = time_print(&timer)/(double)ITER; if (err < 0) { printf("Failed to stop counters for group %d for thread %d\n",gid, (-1*err)-1); perfmon_finalize(); topology_finalize(); return 1; } printf("Processed %.1f Mbyte at scale benchmark in %.4f seconds: %.2f MByte/s\n", 1E-6*(2*SIZE*sizeof(DATATYPE)), copy_time, 1E-6*((2*SIZE*sizeof(DATATYPE))/copy_time)); ptr = strtok(estr,","); j = 0; while (ptr != NULL) { for (i = 0;i < numCPUs; i++) { result = perfmon_getResult(gid, j, cpus[i]); printf("Measurement result for event set %s at CPU %d: %f\n", ptr, cpus[i], result); } ptr = strtok(NULL,","); j++; } strcpy(estr, argc[2]); perfmon_setupCounters(gid); err = perfmon_startCounters(); if (err < 0) { printf("Failed to start counters for group %d for thread %d\n",gid, (-1*err)-1); perfmon_finalize(); topology_finalize(); return 1; } time_start(&timer); #pragma omp parallel { for (int k=0; k<ITER; k++) { LIKWID_MARKER_START("stream"); #pragma omp for for (int j=0; j<SIZE; j++) { c[j] = a[j] + b[j]; } LIKWID_MARKER_STOP("stream"); } } time_stop(&timer); err = perfmon_stopCounters(); stream_time = time_print(&timer)/(double)ITER; if (err < 0) { printf("Failed to stop counters for group %d for thread %d\n",gid, (-1*err)-1); perfmon_finalize(); topology_finalize(); return 1; } printf("Processed %.1f Mbyte at stream benchmark in %.4f seconds: %.2f MByte/s\n", 1E-6*(2*SIZE*sizeof(DATATYPE)), copy_time, 1E-6*((2*SIZE*sizeof(DATATYPE))/copy_time)); ptr = strtok(estr,","); j = 0; while (ptr != NULL) { for (i = 0;i < numCPUs; i++) { result = perfmon_getResult(gid, j, cpus[i]); printf("Measurement result for event set %s at CPU %d: %f\n", ptr, cpus[i], result); } ptr = strtok(NULL,","); j++; } strcpy(estr, argc[2]); perfmon_setupCounters(gid); err = perfmon_startCounters(); if (err < 0) { printf("Failed to start counters for group %d for thread %d\n",gid, (-1*err)-1); perfmon_finalize(); topology_finalize(); return 1; } time_start(&timer); #pragma omp parallel { for (int k=0; k<ITER; k++) { LIKWID_MARKER_START("triad"); #pragma omp for for (int j=0; j<SIZE; j++) { a[j] = b[j] + c[j] * scalar; } LIKWID_MARKER_STOP("triad"); } } time_stop(&timer); err = perfmon_stopCounters(); triad_time = time_print(&timer)/(double)ITER; if (err < 0) { printf("Failed to stop counters for group %d for thread %d\n",gid, (-1*err)-1); perfmon_finalize(); topology_finalize(); return 1; } printf("Processed %.1f Mbyte at triad benchmark in %.4f seconds: %.2f MByte/s\n", 1E-6*(4*SIZE*sizeof(DATATYPE)), triad_time, 1E-6*((4*SIZE*sizeof(DATATYPE))/triad_time)); ptr = strtok(estr,","); j = 0; while (ptr != NULL) { for (i = 0;i < numCPUs; i++) { result = perfmon_getResult(gid, j, cpus[i]); printf("Measurement result for event set %s at CPU %d: %f\n", ptr, cpus[i], result); } ptr = strtok(NULL,","); j++; } perfmon_finalize(); affinity_finalize(); topology_finalize(); return 0; }
int main(int argc, char* argv[]) { int i, j; int err; int* cpus; int gid; double result = 0.0; char estr[] = "L2_LINES_IN_ALL:PMC0,L2_TRANS_L2_WB:PMC1"; //perfmon_setVerbosity(3); // Load the topology module and print some values. err = topology_init(); if (err < 0) { printf("Failed to initialize LIKWID's topology module\n"); return 1; } // CpuInfo_t contains global information like name, CPU family, ... CpuInfo_t info = get_cpuInfo(); // CpuTopology_t contains information about the topology of the CPUs. CpuTopology_t topo = get_cpuTopology(); // Create affinity domains. Commonly only needed when reading Uncore counters affinity_init(); printf("Likwid example on a %s with %d CPUs\n", info->name, topo->numHWThreads); cpus = (int*)malloc(topo->numHWThreads * sizeof(int)); if (!cpus) return 1; for (i=0;i<topo->numHWThreads;i++) { cpus[i] = topo->threadPool[i].apicId; } // Must be called before perfmon_init() but only if you want to use another // access mode as the pre-configured one. For direct access (0) you have to // be root. //accessClient_setaccessmode(0); // Initialize the perfmon module. err = perfmon_init(topo->numHWThreads, cpus); if (err < 0) { printf("Failed to initialize LIKWID's performance monitoring module\n"); topology_finalize(); return 1; } // Add eventset string to the perfmon module. gid = perfmon_addEventSet(estr); if (gid < 0) { printf("Failed to add event string %s to LIKWID's performance monitoring module\n", estr); perfmon_finalize(); topology_finalize(); return 1; } // Setup the eventset identified by group ID (gid). err = perfmon_setupCounters(gid); if (err < 0) { printf("Failed to setup group %d in LIKWID's performance monitoring module\n", gid); perfmon_finalize(); topology_finalize(); return 1; } // Start all counters in the previously set up event set. err = perfmon_startCounters(); if (err < 0) { printf("Failed to start counters for group %d for thread %d\n",gid, (-1*err)-1); perfmon_finalize(); topology_finalize(); return 1; } // Perform something sleep(10); // Stop all counters in the previously started event set. err = perfmon_stopCounters(); if (err < 0) { printf("Failed to stop counters for group %d for thread %d\n",gid, (-1*err)-1); perfmon_finalize(); topology_finalize(); return 1; } // Print the result of every thread/CPU for all events in estr. char* ptr = strtok(estr,","); j = 0; while (ptr != NULL) { for (i = 0;i < topo->numHWThreads; i++) { result = perfmon_getResult(gid, j, i); printf("Measurement result for event set %s at CPU %d: %f\n", ptr, cpus[i], result); } ptr = strtok(NULL,","); j++; } free(cpus); // Uninitialize the perfmon module. perfmon_finalize(); affinity_finalize(); // Uninitialize the topology module. topology_finalize(); return 0; }