Compare commits

...

4 Commits
i277 ... i220v2

View File

@@ -656,10 +656,15 @@ bool get_cache_topology_amd(struct cpuInfo* cpu, struct topology* topo) {
void get_topology_from_udev(struct topology* topo) { void get_topology_from_udev(struct topology* topo) {
topo->total_cores = get_ncores_from_cpuinfo(); topo->total_cores = get_ncores_from_cpuinfo();
// TODO: To be improved in the future // TODO: To be improved in the future
// Conservative setting as we only know the total if (topo->total_cores == 1) {
// number of cores. // We can assume it's a single core CPU
topo->logical_cores = topo->total_cores;
topo->physical_cores = topo->total_cores;
}
else {
topo->logical_cores = UNKNOWN_DATA; topo->logical_cores = UNKNOWN_DATA;
topo->physical_cores = UNKNOWN_DATA; topo->physical_cores = UNKNOWN_DATA;
}
topo->smt_available = 1; topo->smt_available = 1;
topo->smt_supported = 1; topo->smt_supported = 1;
topo->sockets = 1; topo->sockets = 1;
@@ -706,28 +711,26 @@ struct topology* get_topology_info(struct cpuInfo* cpu, struct cache* cach, int
switch(cpu->cpu_vendor) { switch(cpu->cpu_vendor) {
case CPU_VENDOR_INTEL: case CPU_VENDOR_INTEL:
bool toporet = false;
if (cpu->maxLevels >= 0x00000004) { if (cpu->maxLevels >= 0x00000004) {
bool toporet = get_topology_from_apic(cpu, topo); toporet = get_topology_from_apic(cpu, topo);
}
else {
printWarn("Can't read topology information from cpuid (needed level is 0x%.8X, max is 0x%.8X)", 0x00000004, cpu->maxLevels);
}
if(!toporet) { if(!toporet) {
#ifdef __linux__ #ifdef __linux__
printWarn("Failed to retrieve topology from APIC, using udev...\n"); printWarn("Failed to retrieve topology from APIC, using udev...");
get_topology_from_udev(topo); get_topology_from_udev(topo);
#else #else
printErr("Failed to retrieve topology from APIC, assumming default values...\n"); if (cpu->maxLevels >= 0x00000004)
printErr("Failed to retrieve topology from APIC, assumming default values...");
topo->logical_cores = UNKNOWN_DATA; topo->logical_cores = UNKNOWN_DATA;
topo->physical_cores = UNKNOWN_DATA; topo->physical_cores = UNKNOWN_DATA;
topo->smt_available = 1; topo->smt_available = 1;
topo->smt_supported = 1; topo->smt_supported = 1;
#endif #endif
} }
}
else {
printWarn("Can't read topology information from cpuid (needed level is 0x%.8X, max is 0x%.8X)", 0x00000001, cpu->maxLevels);
topo->physical_cores = UNKNOWN_DATA;
topo->logical_cores = UNKNOWN_DATA;
topo->smt_available = 1;
topo->smt_supported = 1;
}
break; break;
case CPU_VENDOR_AMD: case CPU_VENDOR_AMD:
case CPU_VENDOR_HYGON: case CPU_VENDOR_HYGON:
@@ -1006,24 +1009,33 @@ char* get_str_topology(struct cpuInfo* cpu, struct topology* topo, bool dual_soc
string = emalloc(sizeof(char) * (strlen(STRING_UNKNOWN) + 1)); string = emalloc(sizeof(char) * (strlen(STRING_UNKNOWN) + 1));
strcpy(string, STRING_UNKNOWN); strcpy(string, STRING_UNKNOWN);
} }
else if(topo->smt_supported > 1) { else {
char cores_str[6];
memset(cores_str, 0, sizeof(char) * 6);
if (topo->physical_cores * topo_sockets > 1)
strcpy(cores_str, "cores");
else
strcpy(cores_str, "core");
if(topo->smt_supported > 1) {
// 4 for digits, 21 for ' cores (SMT disabled)' which is the longest possible output // 4 for digits, 21 for ' cores (SMT disabled)' which is the longest possible output
uint32_t max_size = 4+21+1; uint32_t max_size = 4+21+1;
string = emalloc(sizeof(char) * max_size); string = emalloc(sizeof(char) * max_size);
if(topo->smt_available > 1) if(topo->smt_available > 1)
snprintf(string, max_size, "%d cores (%d threads)", topo->physical_cores * topo_sockets, topo->logical_cores * topo_sockets); snprintf(string, max_size, "%d %s (%d threads)", topo->physical_cores * topo_sockets, cores_str, topo->logical_cores * topo_sockets);
else { else {
if(cpu->cpu_vendor == CPU_VENDOR_AMD) if(cpu->cpu_vendor == CPU_VENDOR_AMD)
snprintf(string, max_size, "%d cores (SMT disabled)", topo->physical_cores * topo_sockets); snprintf(string, max_size, "%d %s (SMT disabled)", topo->physical_cores * topo_sockets, cores_str);
else else
snprintf(string, max_size, "%d cores (HT disabled)", topo->physical_cores * topo_sockets); snprintf(string, max_size, "%d %s (HT disabled)", topo->physical_cores * topo_sockets, cores_str);
} }
} }
else { else {
uint32_t max_size = 4+7+1; uint32_t max_size = 4+7+1;
string = emalloc(sizeof(char) * max_size); string = emalloc(sizeof(char) * max_size);
snprintf(string, max_size, "%d cores",topo->physical_cores * topo_sockets); snprintf(string, max_size, "%d %s",topo->physical_cores * topo_sockets, cores_str);
}
} }
return string; return string;