diff options
author | Simon Quigley <tsimonq2@ubuntu.com> | 2017-06-19 15:19:47 -0500 |
---|---|---|
committer | Simon Quigley <tsimonq2@ubuntu.com> | 2017-06-19 15:19:47 -0500 |
commit | 79c11b29d78a70ae1b04af3b7ca4ec9bb12dd8d7 (patch) | |
tree | c4577e59ae13a8031f937991dcc3a63f68d18db5 /benchmark.c | |
parent | 62eb92d94fa902b4a34dafce45547680a2655b40 (diff) | |
parent | 7aacc9f2510901c9e97b30fa9bcb550bb7f99c03 (diff) |
Merge tag 'upstream/0.5.1+git20170605'
Upstream version 0.5.1+git20170605
Diffstat (limited to 'benchmark.c')
-rw-r--r-- | benchmark.c | 421 |
1 files changed, 0 insertions, 421 deletions
diff --git a/benchmark.c b/benchmark.c deleted file mode 100644 index e31d6b34..00000000 --- a/benchmark.c +++ /dev/null @@ -1,421 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2009 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <hardinfo.h> -#include <iconcache.h> -#include <shell.h> -#include <config.h> -#include <syncmanager.h> - -#include <sys/time.h> -#include <sys/resource.h> - -enum { - BENCHMARK_BLOWFISH, - BENCHMARK_CRYPTOHASH, - BENCHMARK_FIB, - BENCHMARK_NQUEENS, - BENCHMARK_FFT, - BENCHMARK_RAYTRACE, - BENCHMARK_N_ENTRIES -} Entries; - -void scan_fft(gboolean reload); -void scan_raytr(gboolean reload); -void scan_bfsh(gboolean reload); -void scan_cryptohash(gboolean reload); -void scan_fib(gboolean reload); -void scan_nqueens(gboolean reload); - -gchar *callback_fft(); -gchar *callback_raytr(); -gchar *callback_bfsh(); -gchar *callback_fib(); -gchar *callback_cryptohash(); -gchar *callback_nqueens(); - -static ModuleEntry entries[] = { - {"CPU Blowfish", "blowfish.png", callback_bfsh, scan_bfsh}, - {"CPU CryptoHash", "cryptohash.png", callback_cryptohash, scan_cryptohash}, - {"CPU Fibonacci", "nautilus.png", callback_fib, scan_fib}, - {"CPU N-Queens", "nqueens.png", callback_nqueens, scan_nqueens}, - {"FPU FFT", "fft.png", callback_fft, scan_fft}, - {"FPU Raytracing", "raytrace.png", callback_raytr, scan_raytr}, - {NULL} -}; - -typedef struct _ParallelBenchTask ParallelBenchTask; - -struct _ParallelBenchTask { - guint start, end; - gpointer data, callback; -}; - -gpointer benchmark_parallel_for_dispatcher(gpointer data) -{ - ParallelBenchTask *pbt = (ParallelBenchTask *)data; - gpointer (*callback)(unsigned int start, unsigned int end, void *data); - gpointer return_value; - - if ((callback = pbt->callback)) { - DEBUG("this is thread %p; items %d -> %d, data %p", g_thread_self(), - pbt->start, pbt->end, pbt->data); - return_value = callback(pbt->start, pbt->end, pbt->data); - DEBUG("this is thread %p; return value is %p", g_thread_self(), return_value); - } else { - DEBUG("this is thread %p; callback is NULL and it should't be!", g_thread_self()); - } - - g_free(pbt); - - return return_value; -} - -gdouble benchmark_parallel_for(guint start, guint end, - gpointer callback, gpointer callback_data) { - gchar *temp; - guint n_cores, iter_per_core, iter; - gdouble elapsed_time; - GSList *threads = NULL, *t; - GTimer *timer; - - timer = g_timer_new(); - - temp = module_call_method("devices::getProcessorCount"); - n_cores = temp ? atoi(temp) : 1; - g_free(temp); - - while (1) { - iter_per_core = (end - start) / n_cores; - - if (iter_per_core == 0) { - DEBUG("not enough items per core; disabling one"); - n_cores--; - } else { - break; - } - } - - DEBUG("processor has %d cores; processing %d elements (%d per core)", - n_cores, (end - start), iter_per_core); - - g_timer_start(timer); - for (iter = start; iter < end; iter += iter_per_core) { - ParallelBenchTask *pbt = g_new0(ParallelBenchTask, 1); - GThread *thread; - - DEBUG("launching thread %d", 1 + (iter / iter_per_core)); - - pbt->start = iter == 0 ? 0 : iter + 1; - pbt->end = iter + iter_per_core - 1; - pbt->data = callback_data; - pbt->callback = callback; - - if (pbt->end > end) - pbt->end = end; - - thread = g_thread_create((GThreadFunc) benchmark_parallel_for_dispatcher, - pbt, TRUE, NULL); - threads = g_slist_append(threads, thread); - - DEBUG("thread %d launched as context %p", 1 + (iter / iter_per_core), threads->data); - } - - DEBUG("waiting for all threads to finish"); - for (t = threads; t; t = t->next) { - DEBUG("waiting for thread with context %p", t->data); - g_thread_join((GThread *)t->data); - } - - g_timer_stop(timer); - elapsed_time = g_timer_elapsed(timer, NULL); - - g_slist_free(threads); - g_timer_destroy(timer); - - DEBUG("finishing; all threads took %f seconds to finish", elapsed_time); - - return elapsed_time; -} - -static gchar *__benchmark_include_results(gdouble result, - const gchar * benchmark, - ShellOrderType order_type) -{ - GKeyFile *conf; - gchar **machines; - gchar *path, *results = g_strdup(""), *return_value, *processor_frequency; - int i; - - conf = g_key_file_new(); - - path = g_build_filename(g_get_home_dir(), ".hardinfo", "benchmark.conf", NULL); - if (!g_file_test(path, G_FILE_TEST_EXISTS)) { - DEBUG("local benchmark.conf not found, trying system-wide"); - g_free(path); - path = g_build_filename(params.path_data, "benchmark.conf", NULL); - } - - g_key_file_load_from_file(conf, path, 0, NULL); - - machines = g_key_file_get_keys(conf, benchmark, NULL, NULL); - for (i = 0; machines && machines[i]; i++) { - gchar *value; - - value = g_key_file_get_value(conf, benchmark, machines[i], NULL); - results = g_strconcat(results, machines[i], "=", value, "\n", NULL); - - g_free(value); - } - - g_strfreev(machines); - g_free(path); - g_key_file_free(conf); - - processor_frequency = module_call_method("devices::getProcessorFrequency"); - return_value = g_strdup_printf("[$ShellParam$]\n" - "Zebra=1\n" - "OrderType=%d\n" - "ViewType=3\n" - "ColumnTitle$Extra1=CPU Clock\n" - "ColumnTitle$Progress=Results\n" - "ColumnTitle$TextValue=CPU\n" - "ShowColumnHeaders=true\n" - "[%s]\n" - "<big><b>This Machine</b></big>=%.3f|%s MHz\n" - "%s", order_type, benchmark, result, processor_frequency, results); - g_free(processor_frequency); - return return_value; -} - - - -static gchar *benchmark_include_results_reverse(gdouble result, - const gchar * benchmark) -{ - return __benchmark_include_results(result, benchmark, - SHELL_ORDER_DESCENDING); -} - -static gchar *benchmark_include_results(gdouble result, - const gchar * benchmark) -{ - return __benchmark_include_results(result, benchmark, - SHELL_ORDER_ASCENDING); -} - -static gdouble bench_results[BENCHMARK_N_ENTRIES]; - -#include <arch/common/fib.h> -#include <arch/common/cryptohash.h> -#include <arch/common/blowfish.h> -#include <arch/common/raytrace.h> -#include <arch/common/nqueens.h> -#include <arch/common/fft.h> - -gchar *callback_fft() -{ - return benchmark_include_results(bench_results[BENCHMARK_FFT], - "FPU FFT"); -} - -gchar *callback_nqueens() -{ - return benchmark_include_results(bench_results[BENCHMARK_NQUEENS], - "CPU N-Queens"); -} - -gchar *callback_raytr() -{ - return benchmark_include_results(bench_results[BENCHMARK_RAYTRACE], - "FPU Raytracing"); -} - -gchar *callback_bfsh() -{ - return benchmark_include_results(bench_results[BENCHMARK_BLOWFISH], - "CPU Blowfish"); -} - -gchar *callback_cryptohash() -{ - return benchmark_include_results_reverse(bench_results[BENCHMARK_CRYPTOHASH], - "CPU CryptoHash"); -} - -gchar *callback_fib() -{ - return benchmark_include_results(bench_results[BENCHMARK_FIB], - "CPU Fibonacci"); -} - -#define RUN_WITH_HIGH_PRIORITY(fn) \ - do { \ - int old_priority = getpriority(PRIO_PROCESS, 0); \ - setpriority(PRIO_PROCESS, 0, -20); \ - fn(); \ - setpriority(PRIO_PROCESS, 0, old_priority); \ - } while (0); - -void scan_fft(gboolean reload) -{ - SCAN_START(); - RUN_WITH_HIGH_PRIORITY(benchmark_fft); - SCAN_END(); -} - -void scan_nqueens(gboolean reload) -{ - SCAN_START(); - RUN_WITH_HIGH_PRIORITY(benchmark_nqueens); - SCAN_END(); -} - -void scan_raytr(gboolean reload) -{ - SCAN_START(); - RUN_WITH_HIGH_PRIORITY(benchmark_raytrace); - SCAN_END(); -} - -void scan_bfsh(gboolean reload) -{ - SCAN_START(); - RUN_WITH_HIGH_PRIORITY(benchmark_fish); - SCAN_END(); -} - -void scan_cryptohash(gboolean reload) -{ - SCAN_START(); - RUN_WITH_HIGH_PRIORITY(benchmark_cryptohash); - SCAN_END(); -} - -void scan_fib(gboolean reload) -{ - SCAN_START(); - RUN_WITH_HIGH_PRIORITY(benchmark_fib); - SCAN_END(); -} - -const gchar *hi_note_func(gint entry) -{ - switch (entry) { - case BENCHMARK_CRYPTOHASH: - return "Results in MiB/second. Higher is better."; - - case BENCHMARK_FFT: - case BENCHMARK_RAYTRACE: - case BENCHMARK_BLOWFISH: - case BENCHMARK_FIB: - case BENCHMARK_NQUEENS: - return "Results in seconds. Lower is better."; - } - - return NULL; -} - -gchar *hi_module_get_name(void) -{ - return g_strdup("Benchmarks"); -} - -guchar hi_module_get_weight(void) -{ - return 240; -} - -ModuleEntry *hi_module_get_entries(void) -{ - return entries; -} - -ModuleAbout *hi_module_get_about(void) -{ - static ModuleAbout ma[] = { - { - .author = "Leandro A. F. Pereira", - .description = "Perform tasks and compare with other systems", - .version = VERSION, - .license = "GNU GPL version 2"} - }; - - return ma; -} - -static gchar *get_benchmark_results() -{ - void (*scan_callback) (gboolean rescan); - - gint i = G_N_ELEMENTS(entries) - 1; - gchar *machine = module_call_method("devices::getProcessorName"); - gchar *machineclock = module_call_method("devices::getProcessorFrequency"); - gchar *machineram = module_call_method("devices::getMemoryTotal"); - gchar *result = g_strdup_printf("[param]\n" - "machine=%s\n" - "machineclock=%s\n" - "machineram=%s\n" - "nbenchmarks=%d\n", - machine, - machineclock, - machineram, i); - for (; i >= 0; i--) { - if ((scan_callback = entries[i].scan_callback)) { - scan_callback(FALSE); - - result = h_strdup_cprintf("[bench%d]\n" - "name=%s\n" - "value=%f\n", - result, - i, entries[i].name, bench_results[i]); - } - } - - g_free(machine); - g_free(machineclock); - g_free(machineram); - - return result; -} - -void hi_module_init(void) -{ - static SyncEntry se[] = { - { - .fancy_name = "Send benchmark results", - .name = "SendBenchmarkResults", - .save_to = NULL, - .get_data = get_benchmark_results}, - { - .fancy_name = "Receive benchmark results", - .name = "RecvBenchmarkResults", - .save_to = "benchmark.conf", - .get_data = NULL} - }; - - sync_manager_add_entry(&se[0]); - sync_manager_add_entry(&se[1]); -} - -gchar **hi_module_get_dependencies(void) -{ - static gchar *deps[] = { "devices.so", NULL }; - - return deps; -} |