From cb0459a960eb75b9825db602f2ecfe3eef0fffc7 Mon Sep 17 00:00:00 2001 From: Blaise Tine Date: Mon, 28 Jun 2021 01:48:21 -0400 Subject: [PATCH] printf update --- runtime/include/vx_print.h | 4 - runtime/src/vx_print.c | 174 ++++++------------------------ tests/runtime/dev/vx_dev_main.c | 2 +- tests/runtime/nlTest/vx_nl_main.c | 2 +- tests/runtime/simple/main.c | 4 +- tests/runtime/simple/tests.c | 24 ++--- 6 files changed, 47 insertions(+), 163 deletions(-) diff --git a/runtime/include/vx_print.h b/runtime/include/vx_print.h index 6ad02208..c0ecd392 100644 --- a/runtime/include/vx_print.h +++ b/runtime/include/vx_print.h @@ -7,10 +7,6 @@ extern "C" { #endif -void vx_prints(const char * str); -void vx_printx(unsigned value); -void vx_printv(const char * str, unsigned value); - int vx_vprintf(const char* format, va_list va); int vx_printf(const char * format, ...); int vx_putchar(int c); diff --git a/runtime/src/vx_print.c b/runtime/src/vx_print.c index dd24e5b2..80d2cb59 100644 --- a/runtime/src/vx_print.c +++ b/runtime/src/vx_print.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -7,159 +8,46 @@ extern "C" { #endif -static const char* skip_flags(const char* format) { - for (;;) { - int c = *format++; - switch (c) { - case '-': - case '+': - case ' ': - case '#': break; - default : { - return --format; - } - } - } - return NULL; -} - -static const char* skip_width(const char* format) { - if (*format == '*') { - ++format; - } else { - char *endptr; - strtol(format, &endptr, 10); - format = endptr; - } - return format; -} - -static const char* skip_precision(const char* format) { - if (*format == '.') { - ++format; - if (*format == '*') { - ++format; - } else { - char *endptr; - strtol(format, &endptr, 10); - format = endptr; - } - } - return format; -} - -static const char* skip_modifier(const char* format) { - switch (*format) { - case 'h': - format++; - if (*format == 'h') { - format++; - } - break; - case 'l': - ++format; - if (*format == 'l') { - ++format; - } - break; - case 'j': - case 'z': - case 't': - case 'L': - ++format; - break; - default: - break; - } - return format; -} - -static const char* parse_format(const char* format, va_list va) { - char buffer[64]; - char fmt[64]; - - const char* p = format; - p = skip_flags(p); - p = skip_width(p); - p = skip_precision(p); - p = skip_modifier(p); - ++p; - - int i; - - fmt[0] = '%'; - for (i = 0; i < (p - format); ++i) { - fmt[i+1] = format[i]; - } - fmt[i+1] = 0; - - int len = vsnprintf(buffer, 256, fmt, va); - - for (i = 0; i < len; ++i) { - vx_putchar(buffer[i]); - } - - return p; +int __attribute__((noinline)) __vprintf(int index, int tid, const char* format, va_list va) { + __if (index == tid) { + return vprintf(format, va); + }__endif + return 0; } int vx_vprintf(const char* format, va_list va) { - if (format == NULL) - return -1; + int ret = 0; - const char* p = format; - int c = *p++; - while (c) { - if (c == '%') { - p = parse_format(p, va); - c = *p++; - } else { - vx_putchar(c); - c = *p++; - } + // need to execute single-threaded due to potential thread-data dependency + // use manual goto loop to disable compiler optimizations affceting split/join placement + + volatile int nt = vx_num_threads(); + int tid = vx_thread_id(); + + for (int i = 0; i < nt; ++i) { + ret |= __vprintf(i, tid, format, va); } - - return (int)(p - format); -} - -int vx_printf(const char * format, ...) { - va_list va; - va_start(va, format); - int ret = vx_vprintf(format, va); - va_end(va); + return ret; } -static const char hextoa[] = "0123456789abcdef"; +int vx_printf(const char * format, ...) { + int ret = 0; -void vx_prints(const char * str) { - int c = *str++; - while (c) { - vx_putchar(c); - c = *str++; + // need to execute single-threaded due to potential thread-data dependency + // use manual goto loop to disable compiler optimizations affceting split/join placement + + volatile int nt = vx_num_threads(); + int tid = vx_thread_id(); + + va_list va; + va_start(va, format); + for (int i = 0; i < nt; ++i) { + ret |= __vprintf(i, tid, format, va); } -} - -void vx_printx(unsigned value) { - if (value < 16) { - vx_putchar(hextoa[value]); - } else { - int i = 32; - bool start = false; - do { - int temp = (value >> (i - 4)) & 0xf; - if (temp != 0) - start = true; - if (start) - vx_putchar(hextoa[temp]); - i-= 4; - } while (i != 0); - } - vx_putchar('\n'); -} - -void vx_printv(const char * str, unsigned value) { - vx_prints(str); - vx_printx(value); + va_end(va); + + return ret; } #ifdef __cplusplus diff --git a/tests/runtime/dev/vx_dev_main.c b/tests/runtime/dev/vx_dev_main.c index d8c674a1..d9285ea2 100644 --- a/tests/runtime/dev/vx_dev_main.c +++ b/tests/runtime/dev/vx_dev_main.c @@ -79,7 +79,7 @@ int main() { vx_spawn_tasks(arguments.numRows * arguments.numColums, mat_add_kernel, &arguments); vx_print_mat(z, arguments.numRows, arguments.numColums); - vx_prints("Passed!\n"); + vx_printf("Passed!\n"); return 0; } diff --git a/tests/runtime/nlTest/vx_nl_main.c b/tests/runtime/nlTest/vx_nl_main.c index 0557c204..6b9a000c 100644 --- a/tests/runtime/nlTest/vx_nl_main.c +++ b/tests/runtime/nlTest/vx_nl_main.c @@ -16,7 +16,7 @@ int main() { float isq = 1.0f / sqrt(fNum); vx_printf("fibonacci(%d) = %d\n", Num, fib); vx_printf("invAqrt(%f) = %f\n", fNum, isq); - vx_prints("Passed!\n"); + vx_printf("Passed!\n"); return 0; } diff --git a/tests/runtime/simple/main.c b/tests/runtime/simple/main.c index 9396c746..38bfcfec 100644 --- a/tests/runtime/simple/main.c +++ b/tests/runtime/simple/main.c @@ -105,8 +105,8 @@ int main() { unsigned index = (i * arguments.numColums) + j; vx_printf("0x%x ", z[index]); } - vx_prints("\n"); + vx_printf("\n"); } - vx_prints("Passed!\n"); + vx_printf("Passed!\n"); return 0; } \ No newline at end of file diff --git a/tests/runtime/simple/tests.c b/tests/runtime/simple/tests.c index a7a7a2ff..0899cabb 100644 --- a/tests/runtime/simple/tests.c +++ b/tests/runtime/simple/tests.c @@ -17,10 +17,10 @@ void test_tmc() { test_tmc_impl(); vx_tmc(1); - vx_printx(tmc_array[0]); - vx_printx(tmc_array[1]); - vx_printx(tmc_array[2]); - vx_printx(tmc_array[3]); + vx_printf("%x", tmc_array[0]); + vx_printf("%x", tmc_array[1]); + vx_printf("%x", tmc_array[2]); + vx_printf("%x", tmc_array[3]); return; } @@ -57,10 +57,10 @@ void test_divergence() { vx_tmc(1); - vx_printx(div_arr[0]); - vx_printx(div_arr[1]); - vx_printx(div_arr[2]); - vx_printx(div_arr[3]); + vx_printf("%x", div_arr[0]); + vx_printf("%x", div_arr[1]); + vx_printf("%x", div_arr[2]); + vx_printf("%x", div_arr[3]); } unsigned wsapwn_arr[4]; @@ -76,8 +76,8 @@ void simple_kernel() { void test_wsapwn() { vx_wspawn(4, (unsigned)simple_kernel); simple_kernel(); - vx_printx(wsapwn_arr[0]); - vx_printx(wsapwn_arr[1]); - vx_printx(wsapwn_arr[2]); - vx_printx(wsapwn_arr[3]); + vx_printf("%x", wsapwn_arr[0]); + vx_printf("%x", wsapwn_arr[1]); + vx_printf("%x", wsapwn_arr[2]); + vx_printf("%x", wsapwn_arr[3]); } \ No newline at end of file