diff options
Diffstat (limited to 'benchmarks/CUDA/CP/common/src')
| -rw-r--r-- | benchmarks/CUDA/CP/common/src/Makefile | 23 | ||||
| -rw-r--r-- | benchmarks/CUDA/CP/common/src/parboil.c | 349 |
2 files changed, 372 insertions, 0 deletions
diff --git a/benchmarks/CUDA/CP/common/src/Makefile b/benchmarks/CUDA/CP/common/src/Makefile new file mode 100644 index 0000000..74822e2 --- /dev/null +++ b/benchmarks/CUDA/CP/common/src/Makefile @@ -0,0 +1,23 @@ +# (c) 2007 The Board of Trustees of the University of Illinois. + +SRCDIR=$(shell pwd) +BUILDDIR=$(shell pwd)/../lib + +include $(PARBOIL_ROOT)/common/mk/common.mk +include $(PARBOIL_ROOT)/common/mk/cuda.mk + +OBJS=$(BUILDDIR)/parboil.o +TARGET=$(BUILDDIR)/libparboil.a + +all : $(TARGET) + +clean: + rm -f $(OBJS) $(TARGET) + +$(BUILDDIR)/%.o : $(SRCDIR)/%.c + $(CC) -c $(CFLAGS) $^ -o $@ + +$(TARGET) : $(OBJS) + $(AR) rc $@ $? + $(RANLIB) $@ + diff --git a/benchmarks/CUDA/CP/common/src/parboil.c b/benchmarks/CUDA/CP/common/src/parboil.c new file mode 100644 index 0000000..f5ddfc6 --- /dev/null +++ b/benchmarks/CUDA/CP/common/src/parboil.c @@ -0,0 +1,349 @@ +/* + * (c) 2007 The Board of Trustees of the University of Illinois. + */ + +#include <parboil.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +#if _POSIX_VERSION >= 200112L +# include <sys/time.h> +#endif + +/* Free an array of owned strings. */ +static void +free_string_array(char **string_array) +{ + char **p; + + if (!string_array) return; + for (p = string_array; *p; p++) free(*p); + free(string_array); +} + +/* Parse a comma-delimited list of strings into an + * array of strings. */ +static char ** +read_string_array(char *in) +{ + char **ret; + int i; + int count; /* Number of items in the input */ + char *substring; /* Current substring within 'in' */ + + /* Count the number of items in the string */ + count = 1; + for (i = 0; in[i]; i++) if (in[i] == ',') count++; + + /* Allocate storage */ + ret = malloc((count + 1) * sizeof(char *)); + + /* Create copies of the strings from the list */ + substring = in; + for (i = 0; i < count; i++) { + char *substring_end; + int substring_length; + + /* Find length of substring */ + for (substring_end = substring; + (*substring_end != ',') && (*substring_end != 0); + substring_end++); + + substring_length = substring_end - substring; + + /* Allocate memory and copy the substring */ + ret[i] = malloc(substring_length + 1); + memcpy(ret[i], substring, substring_length); + ret[i][substring_length] = 0; + + /* go to next substring */ + substring = substring_end + 1; + } + ret[i] = NULL; /* Write the sentinel value */ + + return ret; +} + +struct argparse { + int argc; /* Number of arguments. Mutable. */ + char **argv; /* Argument values. Immutable. */ + + int argn; /* Current argument number. */ + char **argv_get; /* Argument value being read. */ + char **argv_put; /* Argument value being written. + * argv_put <= argv_get. */ +}; + +static void +initialize_argparse(struct argparse *ap, int argc, char **argv) +{ + ap->argc = argc; + ap->argn = 0; + ap->argv_get = ap->argv_put = ap->argv = argv; +} + +static void +finalize_argparse(struct argparse *ap) +{ + /* Move the remaining arguments */ + for(; ap->argn < ap->argc; ap->argn++) + *ap->argv_put++ = *ap->argv_get++; +} + +/* Delete the current argument. */ +static void +delete_argument(struct argparse *ap) +{ + if (ap->argn >= ap->argc) { + fprintf(stderr, "delete_argument\n"); + } + ap->argc--; + ap->argv_get++; +} + +/* Go to the next argument. Also, move the current argument to its + * final location in argv. */ +static void +next_argument(struct argparse *ap) +{ + if (ap->argn >= ap->argc) { + fprintf(stderr, "next_argument\n"); + } + /* Move argument to its new location. */ + *ap->argv_put++ = *ap->argv_get++; + ap->argn++; +} + +static int +is_end_of_arguments(struct argparse *ap) +{ + return ap->argn == ap->argc; +} + +static char * +get_argument(struct argparse *ap) +{ + return *ap->argv_get; +} + +static char * +consume_argument(struct argparse *ap) +{ + char *ret = get_argument(ap); + delete_argument(ap); + return ret; +} + +struct pb_Parameters * +pb_ReadParameters(int *_argc, char **argv) +{ + char *err_message; + struct argparse ap; + struct pb_Parameters *ret = malloc(sizeof(struct pb_Parameters)); + + /* Initialize the parameters structure */ + ret->outFile = NULL; + ret->inpFiles = malloc(sizeof(char *)); + ret->inpFiles[0] = NULL; + ret->synchronizeGpu = 0; + + /* Each argument */ + initialize_argparse(&ap, *_argc, argv); + while(!is_end_of_arguments(&ap)) { + char *arg = get_argument(&ap); + + /* Single-character flag */ + if ((arg[0] == '-') && (arg[1] != 0) && (arg[2] == 0)) { + delete_argument(&ap); /* This argument is consumed here */ + + switch(arg[1]) { + case 'o': /* Output file name */ + if (is_end_of_arguments(&ap)) + { + err_message = "Expecting file name after '-o'\n"; + goto error; + } + free(ret->outFile); + ret->outFile = strdup(consume_argument(&ap)); + break; + case 'i': /* Input file name */ + if (is_end_of_arguments(&ap)) + { + err_message = "Expecting file name after '-i'\n"; + goto error; + } + ret->inpFiles = read_string_array(consume_argument(&ap)); + break; + case 'S': /* Synchronize */ + ret->synchronizeGpu = 1; + break; + case '-': /* End of options */ + goto end_of_options; + default: + err_message = "Unexpected command-line parameter\n"; + goto error; + } + } + else { + /* Other parameters are ignored */ + next_argument(&ap); + } + } /* end for each argument */ + + end_of_options: + *_argc = ap.argc; /* Save the modified argc value */ + finalize_argparse(&ap); + + return ret; + + error: + fputs(err_message, stderr); + pb_FreeParameters(ret); + return NULL; +} + +void +pb_FreeParameters(struct pb_Parameters *p) +{ + char **cpp; + + free(p->outFile); + free_string_array(p->inpFiles); + free(p); +} + +int +pb_Parameters_CountInputs(struct pb_Parameters *p) +{ + int n; + + for (n = 0; p->inpFiles[n]; n++); + return n; +} + +/*****************************************************************************/ +/* Timer routines */ + +static void +accumulate_time(pb_Timestamp *accum, + pb_Timestamp start, + pb_Timestamp end) +{ +#if _POSIX_VERSION >= 200112L + *accum += end - start; +#else +# error "Timestamps not implemented for this system" +#endif +} + +void +pb_ResetTimer(struct pb_Timer *timer) +{ + timer->state = pb_Timer_STOPPED; + +#if _POSIX_VERSION >= 200112L + timer->elapsed = 0; +#else +# error "pb_ResetTimer: not implemented for this system" +#endif +} + +void +pb_StartTimer(struct pb_Timer *timer) +{ + if (timer->state != pb_Timer_STOPPED) { + fputs("Ignoring attempt to start a running timer\n", stderr); + return; + } + + timer->state = pb_Timer_RUNNING; + +#if _POSIX_VERSION >= 200112L + { + struct timeval tv; + gettimeofday(&tv, NULL); + timer->init = tv.tv_sec * 1000000LL + tv.tv_usec; + } +#else +# error "pb_StartTimer: not implemented for this system" +#endif +} + +void +pb_StopTimer(struct pb_Timer *timer) +{ + pb_Timestamp fini; + + if (timer->state != pb_Timer_RUNNING) { + fputs("Ignoring attempt to stop a stopped timer\n", stderr); + return; + } + + timer->state = pb_Timer_STOPPED; + +#if _POSIX_VERSION >= 200112L + { + struct timeval tv; + gettimeofday(&tv, NULL); + fini = tv.tv_sec * 1000000LL + tv.tv_usec; + } +#else +# error "pb_StopTimer: not implemented for this system" +#endif + + accumulate_time(&timer->elapsed, timer->init, fini); +} + +/* Get the elapsed time in seconds. */ +double +pb_GetElapsedTime(struct pb_Timer *timer) +{ + double ret; + + if (timer->state != pb_Timer_STOPPED) { + fputs("Elapsed time from a running timer is inaccurate\n", stderr); + } + +#if _POSIX_VERSION >= 200112L + ret = timer->elapsed / 1e6; +#else +# error "pb_GetElapsedTime: not implemented for this system" +#endif + return ret; +} + +void +pb_InitializeTimerSet(struct pb_TimerSet *timers) +{ + int n; + + timers->current = pb_TimerID_NONE; + + for (n = 0; n < pb_TimerID_LAST; n++) + pb_ResetTimer(&timers->timers[n]); +} + +void +pb_SwitchToTimer(struct pb_TimerSet *timers, enum pb_TimerID timer) +{ + /* Stop the currently running timer */ + if (timers->current != pb_TimerID_NONE) + pb_StopTimer(&timers->timers[timers->current]); + + timers->current = timer; + + /* Start the new timer */ + if (timer != pb_TimerID_NONE) + pb_StartTimer(&timers->timers[timer]); +} + +void +pb_PrintTimerSet(struct pb_TimerSet *timers) +{ + struct pb_Timer *t = timers->timers; + printf("IO: %f\n", pb_GetElapsedTime(&t[pb_TimerID_IO])); + printf("GPU: %f\n", pb_GetElapsedTime(&t[pb_TimerID_GPU])); + printf("Copy: %f\n", pb_GetElapsedTime(&t[pb_TimerID_COPY])); + printf("Compute: %f\n", pb_GetElapsedTime(&t[pb_TimerID_COMPUTE])); +} |
