static int lua_likwid_init(lua_State* L) { int ret; int nrThreads = luaL_checknumber(L,1); luaL_argcheck(L, nrThreads > 0, 1, "CPU count must be greater than 0"); int cpus[nrThreads]; if (!lua_istable(L, -1)) { lua_pushstring(L,"No table given as second argument"); lua_error(L); } for (ret = 1; ret<=nrThreads; ret++) { lua_rawgeti(L,-1,ret); cpus[ret-1] = lua_tounsigned(L,-1); lua_pop(L,1); } if (topology_isInitialized == 0) { topology_init(); topology_isInitialized = 1; cpuinfo = get_cpuInfo(); cputopo = get_cpuTopology(); } if ((topology_isInitialized) && (cpuinfo == NULL)) { cpuinfo = get_cpuInfo(); } if ((topology_isInitialized) && (cputopo == NULL)) { cputopo = get_cpuTopology(); } if (numa_isInitialized == 0) { numa_init(); numa_isInitialized = 1; numainfo = get_numaTopology(); } if ((numa_isInitialized) && (numainfo == NULL)) { numainfo = get_numaTopology(); } if (perfmon_isInitialized == 0) { ret = perfmon_init(nrThreads, &(cpus[0])); if (ret != 0) { lua_pushstring(L,"Cannot initialize likwid perfmon"); lua_error(L); return 1; } perfmon_isInitialized = 1; timer_isInitialized = 1; lua_pushinteger(L,ret); } return 1; }
int test_numainit() { int i = 0; topology_init(); numa_init(); NumaTopology_t numainfo = get_numaTopology(); if (numainfo == NULL) goto fail; if (numainfo->numberOfNodes <= 0) goto fail; if (likwid_getNumberOfNodes() <= 0) goto fail; for (i = 0; i < likwid_getNumberOfNodes(); i++) { if (numainfo->nodes[i].totalMemory == 0) goto fail; if (numainfo->nodes[i].freeMemory == 0) goto fail; if (numainfo->nodes[i].numberOfProcessors == 0) goto fail; if (numainfo->nodes[i].numberOfDistances == 0) goto fail; if (numainfo->nodes[i].numberOfDistances != likwid_getNumberOfNodes()) goto fail; } numa_finalize(); topology_finalize(); return 1; fail: numa_finalize(); topology_finalize(); return 0; }
static int lua_likwid_getAffinityInfo(lua_State* L) { int i,j; if (topology_isInitialized == 0) { topology_init(); topology_isInitialized = 1; cpuinfo = get_cpuInfo(); cputopo = get_cpuTopology(); } if ((topology_isInitialized) && (cpuinfo == NULL)) { cpuinfo = get_cpuInfo(); } if ((topology_isInitialized) && (cputopo == NULL)) { cputopo = get_cpuTopology(); } if (numa_isInitialized == 0) { if (numa_init() == 0) { numa_isInitialized = 1; numainfo = get_numaTopology(); } } if ((numa_isInitialized) && (numainfo == NULL)) { numainfo = get_numaTopology(); } if (affinity_isInitialized == 0) { affinity_init(); affinity_isInitialized = 1; affinity = get_affinityDomains(); } if ((affinity_isInitialized) && (affinity == NULL)) { affinity = get_affinityDomains(); } if (!affinity) { lua_pushstring(L,"Cannot initialize affinity groups"); lua_error(L); } lua_newtable(L); lua_pushstring(L,"numberOfAffinityDomains"); lua_pushunsigned(L,affinity->numberOfAffinityDomains); lua_settable(L,-3); lua_pushstring(L,"numberOfSocketDomains"); lua_pushunsigned(L,affinity->numberOfSocketDomains); lua_settable(L,-3); lua_pushstring(L,"numberOfNumaDomains"); lua_pushunsigned(L,affinity->numberOfNumaDomains); lua_settable(L,-3); lua_pushstring(L,"numberOfProcessorsPerSocket"); lua_pushunsigned(L,affinity->numberOfProcessorsPerSocket); lua_settable(L,-3); lua_pushstring(L,"numberOfCacheDomains"); lua_pushunsigned(L,affinity->numberOfCacheDomains); lua_settable(L,-3); lua_pushstring(L,"numberOfCoresPerCache"); lua_pushunsigned(L,affinity->numberOfCoresPerCache); lua_settable(L,-3); lua_pushstring(L,"numberOfProcessorsPerCache"); lua_pushunsigned(L,affinity->numberOfProcessorsPerCache); lua_settable(L,-3); lua_pushstring(L,"domains"); lua_newtable(L); for(i=0;i<affinity->numberOfAffinityDomains;i++) { lua_pushunsigned(L, i+1); lua_newtable(L); lua_pushstring(L,"tag"); lua_pushstring(L,bdata(affinity->domains[i].tag)); lua_settable(L,-3); lua_pushstring(L,"numberOfProcessors"); lua_pushunsigned(L,affinity->domains[i].numberOfProcessors); lua_settable(L,-3); lua_pushstring(L,"numberOfCores"); lua_pushunsigned(L,affinity->domains[i].numberOfCores); lua_settable(L,-3); lua_pushstring(L,"processorList"); lua_newtable(L); for(j=0;j<affinity->domains[i].numberOfProcessors;j++) { lua_pushunsigned(L,j+1); lua_pushunsigned(L,affinity->domains[i].processorList[j]); lua_settable(L,-3); } lua_settable(L,-3); lua_settable(L,-3); } lua_settable(L,-3); return 1; }
static int lua_likwid_getNumaInfo(lua_State* L) { uint32_t i,j; if (topology_isInitialized == 0) { topology_init(); topology_isInitialized = 1; cpuinfo = get_cpuInfo(); cputopo = get_cpuTopology(); } if ((topology_isInitialized) && (cpuinfo == NULL)) { cpuinfo = get_cpuInfo(); } if ((topology_isInitialized) && (cputopo == NULL)) { cputopo = get_cpuTopology(); } if (numa_isInitialized == 0) { if (numa_init() == 0) { numa_isInitialized = 1; numainfo = get_numaTopology(); } else { lua_newtable(L); lua_pushstring(L,"numberOfNodes"); lua_pushunsigned(L,0); lua_settable(L,-3); lua_pushstring(L,"nodes"); lua_newtable(L); lua_settable(L,-3); return 1; } } if ((numa_isInitialized) && (numainfo == NULL)) { numainfo = get_numaTopology(); } if (affinity_isInitialized == 0) { affinity_init(); affinity_isInitialized = 1; affinity = get_affinityDomains(); } if ((affinity_isInitialized) && (affinity == NULL)) { affinity = get_affinityDomains(); } lua_newtable(L); lua_pushstring(L,"numberOfNodes"); lua_pushunsigned(L,numainfo->numberOfNodes); lua_settable(L,-3); lua_pushstring(L,"nodes"); lua_newtable(L); for(i=0;i<numainfo->numberOfNodes;i++) { lua_pushinteger(L, i+1); lua_newtable(L); lua_pushstring(L,"id"); lua_pushunsigned(L,numainfo->nodes[i].id); lua_settable(L,-3); lua_pushstring(L,"totalMemory"); lua_pushunsigned(L,numainfo->nodes[i].totalMemory); lua_settable(L,-3); lua_pushstring(L,"freeMemory"); lua_pushunsigned(L,numainfo->nodes[i].freeMemory); lua_settable(L,-3); lua_pushstring(L,"numberOfProcessors"); lua_pushunsigned(L,numainfo->nodes[i].numberOfProcessors); lua_settable(L,-3); lua_pushstring(L,"numberOfDistances"); lua_pushunsigned(L,numainfo->nodes[i].numberOfDistances); lua_settable(L,-3); lua_pushstring(L,"processors"); lua_newtable(L); for(j=0;j<numainfo->nodes[i].numberOfProcessors;j++) { lua_pushunsigned(L,j+1); lua_pushunsigned(L,numainfo->nodes[i].processors[j]); lua_settable(L,-3); } lua_settable(L,-3); /*lua_pushstring(L,"processorsCompact"); lua_newtable(L); for(j=0;j<numa->nodes[i].numberOfProcessors;j++) { lua_pushunsigned(L,j); lua_pushunsigned(L,numa->nodes[i].processorsCompact[j]); lua_settable(L,-3); } lua_settable(L,-3);*/ lua_pushstring(L,"distances"); lua_newtable(L); for(j=0;j<numainfo->nodes[i].numberOfDistances;j++) { lua_pushinteger(L,j+1); lua_newtable(L); lua_pushinteger(L,j); lua_pushunsigned(L,numainfo->nodes[i].distances[j]); lua_settable(L,-3); lua_settable(L,-3); } lua_settable(L,-3); lua_settable(L,-3); } lua_settable(L,-3); return 1; }
static int lua_likwid_getCpuTopology(lua_State* L) { int i; TreeNode* socketNode; int socketCount = 0; TreeNode* coreNode; int coreCount = 0; TreeNode* threadNode; int threadCount = 0; if (topology_isInitialized == 0) { topology_init(); topology_isInitialized = 1; cputopo = get_cpuTopology(); } if ((topology_isInitialized) && (cputopo == NULL)) { cputopo = get_cpuTopology(); } if (numa_isInitialized == 0) { if (numa_init() == 0) { numa_isInitialized = 1; numainfo = get_numaTopology(); } } if ((numa_isInitialized) && (numainfo == NULL)) { numainfo = get_numaTopology(); } lua_newtable(L); lua_pushstring(L,"numHWThreads"); lua_pushunsigned(L,cputopo->numHWThreads); lua_settable(L,-3); lua_pushstring(L,"activeHWThreads"); lua_pushunsigned(L,cputopo->activeHWThreads); lua_settable(L,-3); lua_pushstring(L,"numSockets"); lua_pushunsigned(L,cputopo->numSockets); lua_settable(L,-3); lua_pushstring(L,"numCoresPerSocket"); lua_pushunsigned(L,cputopo->numCoresPerSocket); lua_settable(L,-3); lua_pushstring(L,"numThreadsPerCore"); lua_pushunsigned(L,cputopo->numThreadsPerCore); lua_settable(L,-3); lua_pushstring(L,"numCacheLevels"); lua_pushinteger(L,cputopo->numCacheLevels); lua_settable(L,-3); lua_pushstring(L,"threadPool"); lua_newtable(L); for(i=0;i<cputopo->numHWThreads;i++) { lua_pushnumber(L,i); lua_newtable(L); lua_pushstring(L,"threadId"); lua_pushunsigned(L,cputopo->threadPool[i].threadId); lua_settable(L,-3); lua_pushstring(L,"coreId"); lua_pushunsigned(L,cputopo->threadPool[i].coreId); lua_settable(L,-3); lua_pushstring(L,"packageId"); lua_pushunsigned(L,cputopo->threadPool[i].packageId); lua_settable(L,-3); lua_pushstring(L,"apicId"); lua_pushunsigned(L,cputopo->threadPool[i].apicId); lua_settable(L,-3); lua_pushstring(L,"inCpuSet"); lua_pushunsigned(L,cputopo->threadPool[i].inCpuSet); lua_settable(L,-3); lua_settable(L,-3); } lua_settable(L,-3); lua_pushstring(L,"cacheLevels"); lua_newtable(L); for(i=0;i<cputopo->numCacheLevels;i++) { lua_pushnumber(L,i+1); lua_newtable(L); lua_pushstring(L,"level"); lua_pushunsigned(L,cputopo->cacheLevels[i].level); lua_settable(L,-3); lua_pushstring(L,"associativity"); lua_pushunsigned(L,cputopo->cacheLevels[i].associativity); lua_settable(L,-3); lua_pushstring(L,"sets"); lua_pushunsigned(L,cputopo->cacheLevels[i].sets); lua_settable(L,-3); lua_pushstring(L,"lineSize"); lua_pushunsigned(L,cputopo->cacheLevels[i].lineSize); lua_settable(L,-3); lua_pushstring(L,"size"); lua_pushunsigned(L,cputopo->cacheLevels[i].size); lua_settable(L,-3); lua_pushstring(L,"threads"); lua_pushunsigned(L,cputopo->cacheLevels[i].threads); lua_settable(L,-3); lua_pushstring(L,"inclusive"); lua_pushunsigned(L,cputopo->cacheLevels[i].inclusive); lua_settable(L,-3); lua_pushstring(L,"type"); switch (cputopo->cacheLevels[i].type) { case DATACACHE: lua_pushstring(L,"DATACACHE"); break; case INSTRUCTIONCACHE: lua_pushstring(L,"INSTRUCTIONCACHE"); break; case UNIFIEDCACHE: lua_pushstring(L,"UNIFIEDCACHE"); break; case ITLB: lua_pushstring(L,"ITLB"); break; case DTLB: lua_pushstring(L,"DTLB"); break; case NOCACHE: default: lua_pushstring(L,"NOCACHE"); break; } lua_settable(L,-3); lua_settable(L,-3); } lua_settable(L,-3); lua_pushstring(L,"topologyTree"); lua_newtable(L); socketNode = tree_getChildNode(cputopo->topologyTree); while (socketNode != NULL) { lua_pushinteger(L, socketCount); lua_newtable(L); lua_pushstring(L, "ID"); lua_pushunsigned(L,socketNode->id); lua_settable(L, -3); lua_pushstring(L, "Childs"); lua_newtable(L); coreCount = 0; coreNode = tree_getChildNode(socketNode); while (coreNode != NULL) { lua_pushinteger(L, coreCount); lua_newtable(L); lua_pushstring(L, "ID"); lua_pushunsigned(L,coreNode->id); lua_settable(L,-3); lua_pushstring(L, "Childs"); lua_newtable(L); threadNode = tree_getChildNode(coreNode); threadCount = 0; while (threadNode != NULL) { lua_pushunsigned(L,threadCount); lua_pushunsigned(L,threadNode->id); lua_settable(L,-3); threadNode = tree_getNextNode(threadNode); threadCount++; } lua_settable(L,-3); coreNode = tree_getNextNode(coreNode); coreCount++; lua_settable(L,-3); } lua_settable(L,-3); socketNode = tree_getNextNode(socketNode); socketCount++; lua_settable(L,-3); } lua_settable(L,-3); return 1; }