From f96e46f931ec81436f31ef3bcffbad34f11b9d58 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Mon, 19 Sep 2016 12:55:41 +1200 Subject: Add very rough multi-core efficiency output --- fractal-gen.c | 30 +++++++++++++++++++++++++++++- fractal-gen.h | 8 ++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/fractal-gen.c b/fractal-gen.c index 0a09c41..fbe7958 100644 --- a/fractal-gen.c +++ b/fractal-gen.c @@ -56,6 +56,15 @@ defaultsd(double *who, double def) *who = def; } +void +*generate(void *section) { + data_section *s = (data_section*)section; + clock_gettime(CLOCK_THREAD_CPUTIME_ID, &(s->time_start)); + (s->generator)(s); + clock_gettime(CLOCK_THREAD_CPUTIME_ID, &(s->time_end)); + return NULL; +} + int main(int argc, char **argv) { @@ -107,6 +116,10 @@ main(int argc, char **argv) ram_nice /= 1024; } + /* FIXME clean up */ + struct timespec time_start, time_end; + clock_gettime(CLOCK_REALTIME, &time_start); + fprintf(stderr, "Forecast resource use:\n" " Threads: %d\n" @@ -142,10 +155,11 @@ main(int argc, char **argv) sections[i].width = width; sections[i].parent_frame.y = f.y; sections[i].parent_frame.x = f.x; + sections[i].generator = generator; sections[i].parent_frame.scale = f.scale; sections[i].datasize = toalloc; fprintf(stderr, " -> Thread %lu\r", i); - pthread_create(§ions[i].thread, NULL, generator, &(sections[i])); + pthread_create(§ions[i].thread, NULL, generate, &(sections[i])); } s = &(sections[cores-1]); @@ -170,6 +184,20 @@ main(int argc, char **argv) kill(child, SIGKILL); + clock_gettime(CLOCK_REALTIME, &time_end); + + long time_wall = time_end.tv_sec - time_start.tv_sec; + long time_ch = 0; + for (i = 0; i < cores; i++) { + time_ch += sections[i].time_end.tv_sec - sections[i].time_start.tv_sec; + } + + fprintf(stderr, + "Wall-clock time: %ld\n" + "Worker time: %ld\n" + "Multi-core efficiency: %.2f%%\n" + , time_wall, time_ch, 100*((double)(time_wall*cores))/time_ch); + /* Output PGM Header */ printf("P5\n%d\n%d\n255\n",size,size/clust_total); diff --git a/fractal-gen.h b/fractal-gen.h index 210d50f..8dcd167 100644 --- a/fractal-gen.h +++ b/fractal-gen.h @@ -28,16 +28,21 @@ #include #include +typedef void* (*generator_func)(void *); + struct frame { double x; double y; double scale; }; -typedef struct { +typedef struct data_section_s { volatile unsigned long idx; + generator_func generator; struct frame parent_frame; unsigned long core; + struct timespec time_start; + struct timespec time_end; unsigned long width; unsigned long datasize; char* data; @@ -53,7 +58,6 @@ double power; double thread_mult; /* number to multiply available cores by to get thread count */ char *argv0; -typedef void* (*generator_func)(void *); void defaultsd(double*, double); int parse_args(int argc, char **argv); -- cgit v1.1 From 14f76b353d681eb92fa0cd113c2e9c666aaea951 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Mon, 19 Sep 2016 13:33:11 +1200 Subject: Fix upside-down division, use more accurate time stamps --- fractal-gen.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/fractal-gen.c b/fractal-gen.c index fbe7958..fce146f 100644 --- a/fractal-gen.c +++ b/fractal-gen.c @@ -56,6 +56,15 @@ defaultsd(double *who, double def) *who = def; } +double +timespec_diff(struct timespec start, struct timespec end) { + long weight = 1000000000; + time_t s = (end.tv_sec - start.tv_sec); + long ns = (end.tv_nsec - start.tv_nsec) % weight; + + return s + ((double)ns)/weight; +} + void *generate(void *section) { data_section *s = (data_section*)section; @@ -186,17 +195,21 @@ main(int argc, char **argv) clock_gettime(CLOCK_REALTIME, &time_end); - long time_wall = time_end.tv_sec - time_start.tv_sec; - long time_ch = 0; + fprintf(stderr, "\nDone\n"); + + double time_wall = timespec_diff(time_start, time_end); + double time_ch = 0; + for (i = 0; i < cores; i++) { - time_ch += sections[i].time_end.tv_sec - sections[i].time_start.tv_sec; + data_section *s = &(sections[i]); + time_ch += (timespec_diff(s->time_start, s->time_end)) / cores; } fprintf(stderr, - "Wall-clock time: %ld\n" - "Worker time: %ld\n" + "Wall-clock time: %.2f seconds\n" + "Average worker time: %.2f seconds\n" "Multi-core efficiency: %.2f%%\n" - , time_wall, time_ch, 100*((double)(time_wall*cores))/time_ch); + , time_wall, time_ch, 100*(time_ch)/time_wall); /* Output PGM Header */ printf("P5\n%d\n%d\n255\n",size,size/clust_total); @@ -210,7 +223,6 @@ main(int argc, char **argv) putchar(s->data[y*(s->width) + x/cores]); } } - fprintf(stderr, "\nDone\n"); /* Free the memory we allocated for point data */ for (i = 0; i < cores; i++) -- cgit v1.1