diff options
-rw-r--r-- | hardinfo/cpu_util.c | 71 | ||||
-rw-r--r-- | includes/cpu_util.h | 2 | ||||
-rw-r--r-- | modules/benchmark.c | 15 | ||||
-rw-r--r-- | modules/benchmark/bench_results.c | 9 | ||||
-rw-r--r-- | modules/benchmark/sysbench.c | 6 | ||||
-rw-r--r-- | modules/devices.c | 11 |
6 files changed, 75 insertions, 39 deletions
diff --git a/hardinfo/cpu_util.c b/hardinfo/cpu_util.c index 5064c173..60f2bbae 100644 --- a/hardinfo/cpu_util.c +++ b/hardinfo/cpu_util.c @@ -71,37 +71,58 @@ gint get_cpu_int(const char* item, int cpuid, int null_val) { #define MAX_CORES_PER_PACK 256 #define MAX_PACKS 128 -int cpu_procs_cores_threads(int *p, int *c, int *t) { +int cpu_procs_cores_threads_nodes(int *p, int *c, int *t, int *n) +{ cpubits *threads, *cores, *packs; char *tmp; int i, m, pack_id, core_id; + g_file_get_contents("/sys/devices/system/cpu/present", &tmp, NULL, NULL); - if (tmp != NULL) { - threads = cpubits_from_str(tmp); - cores = cpubits_from_str(""); - packs = cpubits_from_str(""); - m = cpubits_max(threads); - for (i = 0; i <= m; i++) { - pack_id = get_cpu_int("topology/physical_package_id", i, CPU_TOPO_NULL); - core_id = get_cpu_int("topology/core_id", i, CPU_TOPO_NULL); - if (pack_id < 0) pack_id = 0; - CPUBIT_SET(packs, pack_id); - if (core_id >= 0) { CPUBIT_SET(cores, (pack_id * MAX_CORES_PER_PACK) + core_id ); } - } - *t = cpubits_count(threads); - *c = cpubits_count(cores); - *p = cpubits_count(packs); - if (!*c) *c = 1; - if (!*p) *p = 1; - free(threads); - free(cores); - free(packs); - free(tmp); - return 1; - } else { - *p = *c = *t = -1; + if (tmp == NULL) { + *p = *c = *t = *n = -1; return 0; } + + threads = cpubits_from_str(tmp); + cores = cpubits_from_str(""); + packs = cpubits_from_str(""); + m = cpubits_max(threads); + for (i = 0; i <= m; i++) { + pack_id = get_cpu_int("topology/physical_package_id", i, CPU_TOPO_NULL); + core_id = get_cpu_int("topology/core_id", i, CPU_TOPO_NULL); + if (pack_id < 0) + pack_id = 0; + CPUBIT_SET(packs, pack_id); + if (core_id >= 0) { + CPUBIT_SET(cores, (pack_id * MAX_CORES_PER_PACK) + core_id); + } + } + + *t = cpubits_count(threads); + *c = cpubits_count(cores); + *p = cpubits_count(packs); + + g_free(tmp); + g_file_get_contents("/sys/devices/system/node/possible", &tmp, NULL, NULL); + if (tmp != NULL) { + cpubits *nodes = cpubits_from_str(tmp); + if (nodes) + *n = cpubits_count(nodes); + free(nodes); + } + + if (!*c) + *c = 1; + if (!*p) + *p = 1; + if (!*n) + *n = 1; + + g_free(threads); + g_free(cores); + g_free(packs); + g_free(tmp); + return 1; } cpufreq_data *cpufreq_new(gint id) diff --git a/includes/cpu_util.h b/includes/cpu_util.h index c11d3f69..1adbf491 100644 --- a/includes/cpu_util.h +++ b/includes/cpu_util.h @@ -47,4 +47,6 @@ void cputopo_free(cpu_topology_data *cputd); gchar *cputopo_section_str(cpu_topology_data *cputd); +int cpu_procs_cores_threads_nodes(int *p, int *c, int *t, int *n); + #endif diff --git a/modules/benchmark.c b/modules/benchmark.c index 6d36100f..4b536d42 100644 --- a/modules/benchmark.c +++ b/modules/benchmark.c @@ -135,14 +135,15 @@ bench_value benchmark_crunch_for(float seconds, gpointer callback, gpointer callback_data) { - int cpu_procs, cpu_cores, cpu_threads, thread_number, stop = 0; + int cpu_procs, cpu_cores, cpu_threads, cpu_nodes; + int thread_number, stop = 0; GSList *threads = NULL, *t; GTimer *timer; bench_value ret = EMPTY_BENCH_VALUE; timer = g_timer_new(); - cpu_procs_cores_threads(&cpu_procs, &cpu_cores, &cpu_threads); + cpu_procs_cores_threads_nodes(&cpu_procs, &cpu_cores, &cpu_threads, &cpu_nodes); if (n_threads > 0) ret.threads_used = n_threads; else if (n_threads < 0) @@ -222,12 +223,14 @@ static gpointer benchmark_parallel_for_dispatcher(gpointer data) bench_value benchmark_parallel(gint n_threads, gpointer callback, gpointer callback_data) { - int cpu_procs, cpu_cores, cpu_threads; - cpu_procs_cores_threads(&cpu_procs, &cpu_cores, &cpu_threads); + int cpu_procs, cpu_cores, cpu_threads, cpu_nodes; + cpu_procs_cores_threads_nodes(&cpu_procs, &cpu_cores, &cpu_threads, &cpu_nodes); + if (n_threads == 0) n_threads = cpu_threads; else if (n_threads == -1) n_threads = cpu_cores; + return benchmark_parallel_for(n_threads, 0, n_threads, callback, callback_data); } @@ -244,7 +247,7 @@ bench_value benchmark_parallel_for(gint n_threads, gpointer callback_data) { gchar *temp; - int cpu_procs, cpu_cores, cpu_threads; + int cpu_procs, cpu_cores, cpu_threads, cpu_nodes; guint iter_per_thread, iter, thread_number = 0; GSList *threads = NULL, *t; GTimer *timer; @@ -253,7 +256,7 @@ bench_value benchmark_parallel_for(gint n_threads, timer = g_timer_new(); - cpu_procs_cores_threads(&cpu_procs, &cpu_cores, &cpu_threads); + cpu_procs_cores_threads_nodes(&cpu_procs, &cpu_cores, &cpu_threads, &cpu_nodes); if (n_threads > 0) ret.threads_used = n_threads; diff --git a/modules/benchmark/bench_results.c b/modules/benchmark/bench_results.c index 40345aa5..6ba475ed 100644 --- a/modules/benchmark/bench_results.c +++ b/modules/benchmark/bench_results.c @@ -40,6 +40,7 @@ typedef struct { int processors; int cores; int threads; + int nodes; char *mid; int ptr_bits; /* 32, 64... BENCH_PTR_BITS; 0 for unspecified */ int is_su_data; /* 1 = data collected as root */ @@ -183,7 +184,7 @@ bench_machine *bench_machine_this() m->machine_type = module_call_method("computer::getMachineType"); free(tmp); - cpu_procs_cores_threads(&m->processors, &m->cores, &m->threads); + cpu_procs_cores_threads_nodes(&m->processors, &m->cores, &m->threads, &m->nodes); gen_machine_id(m); } return m; @@ -355,6 +356,11 @@ bench_result *bench_result_benchmarkjson(const gchar *bench_name, json_get_string(machine, "UserNote")); filter_invalid_chars(b->bvalue.user_note); + int nodes = json_get_int(machine, "NumNodes"); + + if (nodes == 0) + nodes = 1; + b->machine = bench_machine_new(); *b->machine = (bench_machine){ .board = json_get_string_dup(machine, "Board"), @@ -367,6 +373,7 @@ bench_result *bench_result_benchmarkjson(const gchar *bench_name, .processors = json_get_int(machine, "NumCpus"), .cores = json_get_int(machine, "NumCores"), .threads = json_get_int(machine, "NumThreads"), + .nodes = nodes, .mid = json_get_string_dup(machine, "MachineId"), .ptr_bits = json_get_int(machine, "PointerBits"), .is_su_data = json_get_boolean(machine, "DataFromSuperUser"), diff --git a/modules/benchmark/sysbench.c b/modules/benchmark/sysbench.c index 9b8a4a38..75008804 100644 --- a/modules/benchmark/sysbench.c +++ b/modules/benchmark/sysbench.c @@ -230,8 +230,10 @@ void benchmark_sbcpu_single(void) { } void benchmark_sbcpu_all(void) { - int cpu_procs, cpu_cores, cpu_threads; - cpu_procs_cores_threads(&cpu_procs, &cpu_cores, &cpu_threads); + int cpu_procs, cpu_cores, cpu_threads, cpu_nodes; + + cpu_procs_cores_threads_nodes(&cpu_procs, &cpu_cores, &cpu_threads, &cpu_nodes); + struct sysbench_ctx ctx = { .test = "cpu", .threads = cpu_threads, diff --git a/modules/devices.c b/modules/devices.c index 578cce3f..d6f30aef 100644 --- a/modules/devices.c +++ b/modules/devices.c @@ -166,19 +166,20 @@ static gint proc_cmp_max_freq(Processor *a, Processor *b) { gchar *processor_describe_default(GSList * processors) { - int packs, cores, threads; - const gchar *packs_fmt, *cores_fmt, *threads_fmt; + int packs, cores, threads, nodes; + const gchar *packs_fmt, *cores_fmt, *threads_fmt, *nodes_fmt; gchar *ret, *full_fmt; - cpu_procs_cores_threads(&packs, &cores, &threads); + cpu_procs_cores_threads_nodes(&packs, &cores, &threads, &nodes); /* if topology info was available, else fallback to old method */ if (cores > 0) { packs_fmt = ngettext("%d physical processor", "%d physical processors", packs); cores_fmt = ngettext("%d core", "%d cores", cores); threads_fmt = ngettext("%d thread", "%d threads", threads); - full_fmt = g_strdup_printf(_(/*/NP procs; NC cores; NT threads*/ "%s; %s; %s"), packs_fmt, cores_fmt, threads_fmt); - ret = g_strdup_printf(full_fmt, packs, cores, threads); + nodes_fmt = ngettext("%d NUMA node", "%d NUMA nodes", nodes); + full_fmt = g_strdup_printf(_(/*/NP procs; NC cores; NN nodes; NT threads*/ "%s; %s, %s; %s"), packs_fmt, cores_fmt, nodes_fmt, threads_fmt); + ret = g_strdup_printf(full_fmt, packs, cores, nodes, threads); g_free(full_fmt); return ret; } else { |