diff --git a/codes/gemver/gemver.c b/codes/gemver/gemver.c new file mode 100644 index 0000000000000000000000000000000000000000..a8008a81e0309be1a3fee958fce88d657c89051c --- /dev/null +++ b/codes/gemver/gemver.c @@ -0,0 +1,186 @@ +/** + * This version is stamped on May 10, 2016 + * + * Contact: + * Louis-Noel Pouchet <pouchet.ohio-state.edu> + * Tomofumi Yuki <tomofumi.yuki.fr> + * + * Web address: http://polybench.sourceforge.net + */ +/* gemver.c: this file is part of PolyBench/C */ + +#include <stdio.h> +#include <unistd.h> +#include <string.h> +#include <math.h> + +/* Include polybench common header. */ +#include <polybench.h> + +/* Include benchmark-specific header. */ +#include "gemver.h" + + +/* Array initialization. */ +static +void init_array (int n, + DATA_TYPE *alpha, + DATA_TYPE *beta, + DATA_TYPE POLYBENCH_2D(A,N,N,n,n), + DATA_TYPE POLYBENCH_1D(u1,N,n), + DATA_TYPE POLYBENCH_1D(v1,N,n), + DATA_TYPE POLYBENCH_1D(u2,N,n), + DATA_TYPE POLYBENCH_1D(v2,N,n), + DATA_TYPE POLYBENCH_1D(w,N,n), + DATA_TYPE POLYBENCH_1D(x,N,n), + DATA_TYPE POLYBENCH_1D(y,N,n), + DATA_TYPE POLYBENCH_1D(z,N,n)) +{ + int i, j; + + *alpha = 1.5; + *beta = 1.2; + + DATA_TYPE fn = (DATA_TYPE)n; + + for (i = 0; i < n; i++) + { + u1[i] = i; + u2[i] = ((i+1)/fn)/2.0; + v1[i] = ((i+1)/fn)/4.0; + v2[i] = ((i+1)/fn)/6.0; + y[i] = ((i+1)/fn)/8.0; + z[i] = ((i+1)/fn)/9.0; + x[i] = 0.0; + w[i] = 0.0; + for (j = 0; j < n; j++) + A[i][j] = (DATA_TYPE) (i*j % n) / n; + } +} + + +/* DCE code. Must scan the entire live-out data. + Can be used also to check the correctness of the output. */ +static +void print_array(int n, + DATA_TYPE POLYBENCH_1D(w,N,n)) +{ + int i; + + POLYBENCH_DUMP_START; + POLYBENCH_DUMP_BEGIN("w"); + for (i = 0; i < n; i++) { + if (i % 20 == 0) fprintf (POLYBENCH_DUMP_TARGET, "\n"); + fprintf (POLYBENCH_DUMP_TARGET, DATA_PRINTF_MODIFIER, w[i]); + } + POLYBENCH_DUMP_END("w"); + POLYBENCH_DUMP_FINISH; +} + + +/* Main computational kernel. The whole function will be timed, + including the call and return. */ +static +void kernel_gemver(int n, + DATA_TYPE alpha, + DATA_TYPE beta, + DATA_TYPE POLYBENCH_2D(A,N,N,n,n), + DATA_TYPE POLYBENCH_1D(u1,N,n), + DATA_TYPE POLYBENCH_1D(v1,N,n), + DATA_TYPE POLYBENCH_1D(u2,N,n), + DATA_TYPE POLYBENCH_1D(v2,N,n), + DATA_TYPE POLYBENCH_1D(w,N,n), + DATA_TYPE POLYBENCH_1D(x,N,n), + DATA_TYPE POLYBENCH_1D(y,N,n), + DATA_TYPE POLYBENCH_1D(z,N,n)) +{ + int i, j; + +#pragma scop + + for (i = 0; i < _PB_N; i++) + for (j = 0; j < _PB_N; j++) + A[i][j] = A[i][j] + u1[i] * v1[j] + u2[i] * v2[j]; + + for (i = 0; i < _PB_N; i++) + for (j = 0; j < _PB_N; j++) + x[i] = x[i] + beta * A[j][i] * y[j]; + + for (i = 0; i < _PB_N; i++) + x[i] = x[i] + z[i]; + + for (i = 0; i < _PB_N; i++) + for (j = 0; j < _PB_N; j++) + w[i] = w[i] + alpha * A[i][j] * x[j]; + +#pragma endscop +} + + +int main(int argc, char** argv) +{ + /* Retrieve problem size. */ + int n = N; + + /* Variable declaration/allocation. */ + DATA_TYPE alpha; + DATA_TYPE beta; + POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, N, N, n, n); + POLYBENCH_1D_ARRAY_DECL(u1, DATA_TYPE, N, n); + POLYBENCH_1D_ARRAY_DECL(v1, DATA_TYPE, N, n); + POLYBENCH_1D_ARRAY_DECL(u2, DATA_TYPE, N, n); + POLYBENCH_1D_ARRAY_DECL(v2, DATA_TYPE, N, n); + POLYBENCH_1D_ARRAY_DECL(w, DATA_TYPE, N, n); + POLYBENCH_1D_ARRAY_DECL(x, DATA_TYPE, N, n); + POLYBENCH_1D_ARRAY_DECL(y, DATA_TYPE, N, n); + POLYBENCH_1D_ARRAY_DECL(z, DATA_TYPE, N, n); + + + /* Initialize array(s). */ + init_array (n, &alpha, &beta, + POLYBENCH_ARRAY(A), + POLYBENCH_ARRAY(u1), + POLYBENCH_ARRAY(v1), + POLYBENCH_ARRAY(u2), + POLYBENCH_ARRAY(v2), + POLYBENCH_ARRAY(w), + POLYBENCH_ARRAY(x), + POLYBENCH_ARRAY(y), + POLYBENCH_ARRAY(z)); + + /* Start timer. */ + polybench_start_instruments; + + /* Run kernel. */ + kernel_gemver (n, alpha, beta, + POLYBENCH_ARRAY(A), + POLYBENCH_ARRAY(u1), + POLYBENCH_ARRAY(v1), + POLYBENCH_ARRAY(u2), + POLYBENCH_ARRAY(v2), + POLYBENCH_ARRAY(w), + POLYBENCH_ARRAY(x), + POLYBENCH_ARRAY(y), + POLYBENCH_ARRAY(z)); + + /* Stop and print timer. */ + polybench_stop_instruments; + polybench_print_instruments; + + /* Prevent dead-code elimination. All live-out data must be printed + by the function call in argument. */ + polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(w))); + + /* Be clean. */ + POLYBENCH_FREE_ARRAY(A); + POLYBENCH_FREE_ARRAY(u1); + POLYBENCH_FREE_ARRAY(v1); + POLYBENCH_FREE_ARRAY(u2); + POLYBENCH_FREE_ARRAY(v2); + POLYBENCH_FREE_ARRAY(w); + POLYBENCH_FREE_ARRAY(x); + POLYBENCH_FREE_ARRAY(y); + POLYBENCH_FREE_ARRAY(z); + + return 0; +} diff --git a/codes/gemver/gemver.h b/codes/gemver/gemver.h new file mode 100644 index 0000000000000000000000000000000000000000..a0abdd0bb01a2a101b8615c8b85018c1bd47da49 --- /dev/null +++ b/codes/gemver/gemver.h @@ -0,0 +1,74 @@ +/** + * This version is stamped on May 10, 2016 + * + * Contact: + * Louis-Noel Pouchet <pouchet.ohio-state.edu> + * Tomofumi Yuki <tomofumi.yuki.fr> + * + * Web address: http://polybench.sourceforge.net + */ +#ifndef _GEMVER_H +# define _GEMVER_H + +/* Default to LARGE_DATASET. */ +# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(MEDIUM_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET) +# define LARGE_DATASET +# endif + +# if !defined(N) +/* Define sample dataset sizes. */ +# ifdef MINI_DATASET +# define N 40 +# endif + +# ifdef SMALL_DATASET +# define N 120 +# endif + +# ifdef MEDIUM_DATASET +# define N 400 +# endif + +# ifdef LARGE_DATASET +# define N 2000 +# endif + +# ifdef EXTRALARGE_DATASET +# define N 4000 +# endif + + +#endif /* !(N) */ + +# define _PB_N POLYBENCH_LOOP_BOUND(N,n) + + +/* Default data type */ +# if !defined(DATA_TYPE_IS_INT) && !defined(DATA_TYPE_IS_FLOAT) && !defined(DATA_TYPE_IS_DOUBLE) +# define DATA_TYPE_IS_DOUBLE +# endif + +#ifdef DATA_TYPE_IS_INT +# define DATA_TYPE int +# define DATA_PRINTF_MODIFIER "%d " +#endif + +#ifdef DATA_TYPE_IS_FLOAT +# define DATA_TYPE float +# define DATA_PRINTF_MODIFIER "%0.2f " +# define SCALAR_VAL(x) x##f +# define SQRT_FUN(x) sqrtf(x) +# define EXP_FUN(x) expf(x) +# define POW_FUN(x,y) powf(x,y) +# endif + +#ifdef DATA_TYPE_IS_DOUBLE +# define DATA_TYPE double +# define DATA_PRINTF_MODIFIER "%0.2lf " +# define SCALAR_VAL(x) x +# define SQRT_FUN(x) sqrt(x) +# define EXP_FUN(x) exp(x) +# define POW_FUN(x,y) pow(x,y) +# endif + +#endif /* !_GEMVER_H */