#include #include #include #include "fasttime.h" #include "test.h" void usage(const char *progname); void initValue(float *values1, float *values2, double *value3, float *output, unsigned int N); extern void test1(float *a, float *b, float *c, int N); extern void test2(float *__restrict a, float *__restrict b, float *__restrict c, int N); extern double test3(double *__restrict a, int N) ; int main(int argc, char **argv) { int N = 1024; int whichTestToRun = 1; // parse commandline options int opt; static struct option long_options[] = { {"size", 1, 0, 's'}, {"test", 1, 0, 't'}, {"help", 0, 0, '?'}, {0 ,0, 0, 0} }; while ((opt = getopt_long(argc, argv, "st:?", long_options, NULL)) != EOF) { switch (opt) { case 's': N = atoi(optarg); if (N <= 0) { printf("Error: Workload size is set to %d (<0).\n", N); return -1; } break; case 't': whichTestToRun = atoi(optarg); if (whichTestToRun <= 0 || whichTestToRun >= 4) { printf("Error: test%d() is not available.\n", whichTestToRun); return -1; } break; case 'h': default: usage(argv[0]); return 1; } } #define AVX_ALIGNMENT 256 float *values1 = (float *)__builtin_alloca_with_align(N * sizeof(float), AVX_ALIGNMENT); float *values2 = (float *)__builtin_alloca_with_align(N * sizeof(float), AVX_ALIGNMENT); double *values3 = (double *)__builtin_alloca_with_align(N * sizeof(double), AVX_ALIGNMENT); float *output = (float *)__builtin_alloca_with_align(N * sizeof(float), AVX_ALIGNMENT); #undef AVX_ALIGNMENT initValue(values1, values2, values3, output, N); printf("Running test%d()...\n", whichTestToRun); fasttime_t time1 = gettime(); switch (whichTestToRun) { case 1: test1(values1, values2, output, N); break; case 2: test2(values1, values2, output, N); break; case 3: test3(values3, N); break; } fasttime_t time2 = gettime(); double elapsedf = tdiff(time1, time2); printf("Elapsed execution time of the loop in test%d():\n", whichTestToRun); printf("%lfsec (N: %d, I: %d)\n", elapsedf, N, I); return 0; } void usage(const char *progname) { printf("Usage: %s [options]\n", progname); printf("Program Options:\n"); printf(" -s --size Use workload size N (Default = 1024)\n"); printf(" -t --test Just run the testN function (Default = 1)\n"); printf(" -h --help This message\n"); } void initValue(float *values1, float *values2, double *values3, float *output, unsigned int N) { for (unsigned int i=0; i