Commit 02af3cb5 authored by Dominik Brodowski's avatar Dominik Brodowski

cpupowerutils: bench - ConfigStyle bugfixes

Signed-off-by: default avatarDominik Brodowski <linux@dominikbrodowski.net>
parent f5ac0641
...@@ -277,5 +277,4 @@ uninstall: ...@@ -277,5 +277,4 @@ uninstall:
rm -f $(DESTDIR)${localedir}/$$HLANG/LC_MESSAGES/cpupowerutils.mo; \ rm -f $(DESTDIR)${localedir}/$$HLANG/LC_MESSAGES/cpupowerutils.mo; \
done; done;
.PHONY: all utils libcpufreq update-po create-gmo install-lib install-tools install-man install-gmo install uninstall \ .PHONY: all utils libcpufreq update-po create-gmo install-lib install-tools install-man install-gmo install uninstall clean
clean
...@@ -37,7 +37,7 @@ if (config->output != stdout) { \ ...@@ -37,7 +37,7 @@ if (config->output != stdout) { \
* compute how many rounds of calculation we should do * compute how many rounds of calculation we should do
* to get the given load time * to get the given load time
* *
* @param load aimed load time in s * @param load aimed load time in µs
* *
* @retval rounds of calculation * @retval rounds of calculation
**/ **/
...@@ -62,8 +62,7 @@ unsigned int calculate_timespace(long load, struct config *config) ...@@ -62,8 +62,7 @@ unsigned int calculate_timespace(long load, struct config *config)
/* approximation of the wanted load time by comparing with the /* approximation of the wanted load time by comparing with the
* initial calculation time */ * initial calculation time */
for (i= 0; i < 4; i++) for (i = 0; i < 4; i++) {
{
rounds = (unsigned int)(load * estimated / timed); rounds = (unsigned int)(load * estimated / timed);
dprintf("calibrating with %u rounds\n", rounds); dprintf("calibrating with %u rounds\n", rounds);
now = get_time(); now = get_time();
...@@ -102,11 +101,11 @@ void start_benchmark(struct config *config) ...@@ -102,11 +101,11 @@ void start_benchmark(struct config *config)
load_time = config->load; load_time = config->load;
/* For the progress bar */ /* For the progress bar */
for (_round=1; _round <= config->rounds; _round++) for (_round = 1; _round <= config->rounds; _round++)
total_time += _round * (config->sleep + config->load); total_time += _round * (config->sleep + config->load);
total_time *= 2; /* powersave and performance cycles */ total_time *= 2; /* powersave and performance cycles */
for (_round=0; _round < config->rounds; _round++) { for (_round = 0; _round < config->rounds; _round++) {
performance_time = 0LL; performance_time = 0LL;
powersave_time = 0LL; powersave_time = 0LL;
...@@ -130,9 +129,10 @@ void start_benchmark(struct config *config) ...@@ -130,9 +129,10 @@ void start_benchmark(struct config *config)
fprintf(config->output, "%u %li %li ", fprintf(config->output, "%u %li %li ",
_round, load_time, sleep_time); _round, load_time, sleep_time);
if (config->verbose) { if (config->verbose)
printf("avarage: %lius, rps:%li\n", load_time / calculations, 1000000 * calculations / load_time); printf("avarage: %lius, rps:%li\n",
} load_time / calculations,
1000000 * calculations / load_time);
/* do some sleep/load cycles with the performance governor */ /* do some sleep/load cycles with the performance governor */
for (cycle = 0; cycle < config->cycles; cycle++) { for (cycle = 0; cycle < config->cycles; cycle++) {
...@@ -142,10 +142,14 @@ void start_benchmark(struct config *config) ...@@ -142,10 +142,14 @@ void start_benchmark(struct config *config)
then = get_time(); then = get_time();
performance_time += then - now - sleep_time; performance_time += then - now - sleep_time;
if (config->verbose) if (config->verbose)
printf("performance cycle took %lius, sleep: %lius, load: %lius, rounds: %u\n", printf("performance cycle took %lius, "
(long)(then - now), sleep_time, load_time, calculations); "sleep: %lius, "
"load: %lius, rounds: %u\n",
(long)(then - now), sleep_time,
load_time, calculations);
} }
fprintf(config->output, "%li ", performance_time / config->cycles); fprintf(config->output, "%li ",
performance_time / config->cycles);
progress_time += sleep_time + load_time; progress_time += sleep_time + load_time;
show_progress(total_time, progress_time); show_progress(total_time, progress_time);
...@@ -155,7 +159,8 @@ void start_benchmark(struct config *config) ...@@ -155,7 +159,8 @@ void start_benchmark(struct config *config)
if (set_cpufreq_governor(config->governor, config->cpu) != 0) if (set_cpufreq_governor(config->governor, config->cpu) != 0)
return; return;
/* again, do some sleep/load cycles with the powersave governor */ /* again, do some sleep/load cycles with the
* powersave governor */
for (cycle = 0; cycle < config->cycles; cycle++) { for (cycle = 0; cycle < config->cycles; cycle++) {
now = get_time(); now = get_time();
usleep(sleep_time); usleep(sleep_time);
...@@ -163,22 +168,27 @@ void start_benchmark(struct config *config) ...@@ -163,22 +168,27 @@ void start_benchmark(struct config *config)
then = get_time(); then = get_time();
powersave_time += then - now - sleep_time; powersave_time += then - now - sleep_time;
if (config->verbose) if (config->verbose)
printf("powersave cycle took %lius, sleep: %lius, load: %lius, rounds: %u\n", printf("powersave cycle took %lius, "
(long)(then - now), sleep_time, load_time, calculations); "sleep: %lius, "
"load: %lius, rounds: %u\n",
(long)(then - now), sleep_time,
load_time, calculations);
} }
progress_time += sleep_time + load_time; progress_time += sleep_time + load_time;
/* compare the avarage sleep/load cycles */ /* compare the avarage sleep/load cycles */
fprintf(config->output, "%li ", powersave_time / config->cycles); fprintf(config->output, "%li ",
fprintf(config->output, "%.3f\n", performance_time * 100.0 / powersave_time); powersave_time / config->cycles);
fprintf(config->output, "%.3f\n",
performance_time * 100.0 / powersave_time);
fflush(config->output); fflush(config->output);
if (config->verbose) if (config->verbose)
printf("performance is at %.2f%%\n", performance_time * 100.0 / powersave_time); printf("performance is at %.2f%%\n",
performance_time * 100.0 / powersave_time);
sleep_time += config->sleep_step; sleep_time += config->sleep_step;
load_time += config->load_step; load_time += config->load_step;
} }
} }
...@@ -19,9 +19,11 @@ ...@@ -19,9 +19,11 @@
/* load loop, this schould take about 1 to 2ms to complete */ /* load loop, this schould take about 1 to 2ms to complete */
#define ROUNDS(x) {unsigned int rcnt; \ #define ROUNDS(x) {unsigned int rcnt; \
for (rcnt = 0; rcnt< x*1000; rcnt++) { \ for (rcnt = 0; rcnt < x*1000; rcnt++) { \
(void)(((int)(pow(rcnt, rcnt) * sqrt(rcnt*7230970)) ^ 7230716) ^ (int)atan2(rcnt, rcnt)); \ (void)(((int)(pow(rcnt, rcnt) * \
}} \ sqrt(rcnt*7230970)) ^ 7230716) ^ \
(int)atan2(rcnt, rcnt)); \
} } \
void start_benchmark(struct config *config); void start_benchmark(struct config *config);
...@@ -31,6 +31,6 @@ ...@@ -31,6 +31,6 @@
#ifdef DEBUG #ifdef DEBUG
#define dprintf printf #define dprintf printf
#else #else
#define dprintf( ... ) while(0) { } #define dprintf(...) do { } while (0)
#endif #endif
...@@ -28,8 +28,7 @@ ...@@ -28,8 +28,7 @@
#include "system.h" #include "system.h"
#include "benchmark.h" #include "benchmark.h"
static struct option long_options[] = static struct option long_options[] = {
{
{"output", 1, 0, 'o'}, {"output", 1, 0, 'o'},
{"sleep", 1, 0, 's'}, {"sleep", 1, 0, 's'},
{"load", 1, 0, 'l'}, {"load", 1, 0, 'l'},
...@@ -67,7 +66,7 @@ void usage() ...@@ -67,7 +66,7 @@ void usage()
printf(" -o, --output=<dir>\t\t\toutput path. Filename will be OUTPUTPATH/benchmark_TIMESTAMP.log\n"); printf(" -o, --output=<dir>\t\t\toutput path. Filename will be OUTPUTPATH/benchmark_TIMESTAMP.log\n");
printf(" -v, --verbose\t\t\t\tverbose output on/off\n"); printf(" -v, --verbose\t\t\t\tverbose output on/off\n");
printf(" -h, --help\t\t\t\tPrint this help screen\n"); printf(" -h, --help\t\t\t\tPrint this help screen\n");
exit (1); exit(1);
} }
/******************************************************************* /*******************************************************************
......
...@@ -86,7 +86,7 @@ FILE *prepare_output(const char *dirname) ...@@ -86,7 +86,7 @@ FILE *prepare_output(const char *dirname)
len += strlen(sysdata.nodename) + strlen(sysdata.release); len += strlen(sysdata.nodename) + strlen(sysdata.release);
filename = realloc(filename, sizeof(char) * len); filename = realloc(filename, sizeof(char) * len);
if(filename == NULL) { if (filename == NULL) {
perror("realloc"); perror("realloc");
return NULL; return NULL;
} }
...@@ -94,12 +94,14 @@ FILE *prepare_output(const char *dirname) ...@@ -94,12 +94,14 @@ FILE *prepare_output(const char *dirname)
snprintf(filename, len - 1, "%s/benchmark_%s_%s_%li.log", snprintf(filename, len - 1, "%s/benchmark_%s_%s_%li.log",
dirname, sysdata.nodename, sysdata.release, time(NULL)); dirname, sysdata.nodename, sysdata.release, time(NULL));
} else { } else {
snprintf(filename, len -1, "%s/benchmark_%li.log", dirname, time(NULL)); snprintf(filename, len - 1, "%s/benchmark_%li.log",
dirname, time(NULL));
} }
dprintf("logilename: %s\n", filename); dprintf("logilename: %s\n", filename);
if ((output = fopen(filename, "w+")) == NULL) { output = fopen(filename, "w+");
if (output == NULL) {
perror("fopen"); perror("fopen");
fprintf(stderr, "error: unable to open logfile\n"); fprintf(stderr, "error: unable to open logfile\n");
} }
...@@ -171,8 +173,7 @@ int prepare_config(const char *path, struct config *config) ...@@ -171,8 +173,7 @@ int prepare_config(const char *path, struct config *config)
return 1; return 1;
} }
while (getline(&line, &len, configfile) != -1) while (getline(&line, &len, configfile) != -1) {
{
if (line[0] == '#' || line[0] == ' ') if (line[0] == '#' || line[0] == ' ')
continue; continue;
......
...@@ -20,19 +20,22 @@ ...@@ -20,19 +20,22 @@
/* struct that holds the required config parameters */ /* struct that holds the required config parameters */
struct config struct config
{ {
long sleep; /* sleep time in µs */ long sleep; /* sleep time in µs */
long load; /* load time in µs */ long load; /* load time in µs */
long sleep_step; /* time value which changes the long sleep_step; /* time value which changes the
* sleep time after every round in µs */ * sleep time after every round in µs */
long load_step; /* time value which changes the long load_step; /* time value which changes the
* load time after every round in µs */ * load time after every round in µs */
unsigned int cycles; /* calculation cycles with the same sleep/load time */ unsigned int cycles; /* calculation cycles with the same sleep/load time */
unsigned int rounds; /* calculation rounds with iterated sleep/load time */ unsigned int rounds; /* calculation rounds with iterated sleep/load time */
unsigned int cpu; /* cpu for which the affinity is set */ unsigned int cpu; /* cpu for which the affinity is set */
char governor[15]; /* cpufreq governor */ char governor[15]; /* cpufreq governor */
enum sched_prio /* possible scheduler priorities */ enum sched_prio /* possible scheduler priorities */
{ {
SCHED_ERR=-1,SCHED_HIGH, SCHED_DEFAULT, SCHED_LOW SCHED_ERR = -1,
SCHED_HIGH,
SCHED_DEFAULT,
SCHED_LOW
} prio; } prio;
unsigned int verbose; /* verbose output */ unsigned int verbose; /* verbose output */
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
#include "system.h" #include "system.h"
/** /**
* returns time since epoch in s * returns time since epoch in µs
* *
* @retval time * @retval time
**/ **/
...@@ -129,7 +129,7 @@ int set_process_priority(int priority) ...@@ -129,7 +129,7 @@ int set_process_priority(int priority)
} }
/** /**
* notifys the user that the benchmark may run some time * notifies the user that the benchmark may run some time
* *
* @param config benchmark config values * @param config benchmark config values
* *
...@@ -142,8 +142,11 @@ void prepare_user(const struct config *config) ...@@ -142,8 +142,11 @@ void prepare_user(const struct config *config)
unsigned int round; unsigned int round;
for (round = 0; round < config->rounds; round++) { for (round = 0; round < config->rounds; round++) {
sleep_time += 2 * config->cycles * (config->sleep + config->sleep_step * round); sleep_time += 2 * config->cycles *
load_time += 2 * config->cycles * (config->load + config->load_step * round) + (config->load + config->load_step * round * 4); (config->sleep + config->sleep_step * round);
load_time += 2 * config->cycles *
(config->load + config->load_step * round) +
(config->load + config->load_step * round * 4);
} }
if (config->verbose || config->output != stdout) if (config->verbose || config->output != stdout)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment