diff --git a/codes/adi/adi.c b/codes/adi/adi.c new file mode 100644 index 0000000000000000000000000000000000000000..1eee045b3e9a1be2f675cf94a0aba227364c5b97 --- /dev/null +++ b/codes/adi/adi.c @@ -0,0 +1,168 @@ +/** + * 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 + */ +/* adi.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 "adi.h" + + +/* Array initialization. */ +static +void init_array (int n, + DATA_TYPE POLYBENCH_2D(u,N,N,n,n)) +{ + int i, j; + + for (i = 0; i < n; i++) + for (j = 0; j < n; j++) + { + u[i][j] = (DATA_TYPE)(i + n-j) / 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_2D(u,N,N,n,n)) + +{ + int i, j; + + POLYBENCH_DUMP_START; + POLYBENCH_DUMP_BEGIN("u"); + for (i = 0; i < n; i++) + for (j = 0; j < n; j++) { + if ((i * n + j) % 20 == 0) fprintf(POLYBENCH_DUMP_TARGET, "\n"); + fprintf (POLYBENCH_DUMP_TARGET, DATA_PRINTF_MODIFIER, u[i][j]); + } + POLYBENCH_DUMP_END("u"); + POLYBENCH_DUMP_FINISH; +} + + +/* Main computational kernel. The whole function will be timed, + including the call and return. */ +/* Based on a Fortran code fragment from Figure 5 of + * "Automatic Data and Computation Decomposition on Distributed Memory Parallel Computers" + * by Peizong Lee and Zvi Meir Kedem, TOPLAS, 2002 + */ +static +void kernel_adi(int tsteps, int n, + DATA_TYPE POLYBENCH_2D(u,N,N,n,n), + DATA_TYPE POLYBENCH_2D(v,N,N,n,n), + DATA_TYPE POLYBENCH_2D(p,N,N,n,n), + DATA_TYPE POLYBENCH_2D(q,N,N,n,n)) +{ + int t, i, j; + DATA_TYPE DX, DY, DT; + DATA_TYPE B1, B2; + DATA_TYPE mul1, mul2; + DATA_TYPE a, b, c, d, e, f; + +#pragma scop + + DX = SCALAR_VAL(1.0)/(DATA_TYPE)_PB_N; + DY = SCALAR_VAL(1.0)/(DATA_TYPE)_PB_N; + DT = SCALAR_VAL(1.0)/(DATA_TYPE)_PB_TSTEPS; + B1 = SCALAR_VAL(2.0); + B2 = SCALAR_VAL(1.0); + mul1 = B1 * DT / (DX * DX); + mul2 = B2 * DT / (DY * DY); + + a = -mul1 / SCALAR_VAL(2.0); + b = SCALAR_VAL(1.0)+mul1; + c = a; + d = -mul2 / SCALAR_VAL(2.0); + e = SCALAR_VAL(1.0)+mul2; + f = d; + + for (t=1; t<=_PB_TSTEPS; t++) { + //Column Sweep + for (i=1; i<_PB_N-1; i++) { + v[0][i] = SCALAR_VAL(1.0); + p[i][0] = SCALAR_VAL(0.0); + q[i][0] = v[0][i]; + for (j=1; j<_PB_N-1; j++) { + p[i][j] = -c / (a*p[i][j-1]+b); + q[i][j] = (-d*u[j][i-1]+(SCALAR_VAL(1.0)+SCALAR_VAL(2.0)*d)*u[j][i] - f*u[j][i+1]-a*q[i][j-1])/(a*p[i][j-1]+b); + } + + v[_PB_N-1][i] = SCALAR_VAL(1.0); + for (j=_PB_N-2; j>=1; j--) { + v[j][i] = p[i][j] * v[j+1][i] + q[i][j]; + } + } + //Row Sweep + for (i=1; i<_PB_N-1; i++) { + u[i][0] = SCALAR_VAL(1.0); + p[i][0] = SCALAR_VAL(0.0); + q[i][0] = u[i][0]; + for (j=1; j<_PB_N-1; j++) { + p[i][j] = -f / (d*p[i][j-1]+e); + q[i][j] = (-a*v[i-1][j]+(SCALAR_VAL(1.0)+SCALAR_VAL(2.0)*a)*v[i][j] - c*v[i+1][j]-d*q[i][j-1])/(d*p[i][j-1]+e); + } + u[i][_PB_N-1] = SCALAR_VAL(1.0); + for (j=_PB_N-2; j>=1; j--) { + u[i][j] = p[i][j] * u[i][j+1] + q[i][j]; + } + } + } +#pragma endscop +} + + +int main(int argc, char** argv) +{ + /* Retrieve problem size. */ + int n = N; + int tsteps = TSTEPS; + + /* Variable declaration/allocation. */ + POLYBENCH_2D_ARRAY_DECL(u, DATA_TYPE, N, N, n, n); + POLYBENCH_2D_ARRAY_DECL(v, DATA_TYPE, N, N, n, n); + POLYBENCH_2D_ARRAY_DECL(p, DATA_TYPE, N, N, n, n); + POLYBENCH_2D_ARRAY_DECL(q, DATA_TYPE, N, N, n, n); + + + /* Initialize array(s). */ + init_array (n, POLYBENCH_ARRAY(u)); + + /* Start timer. */ + polybench_start_instruments; + + /* Run kernel. */ + kernel_adi (tsteps, n, POLYBENCH_ARRAY(u), POLYBENCH_ARRAY(v), POLYBENCH_ARRAY(p), POLYBENCH_ARRAY(q)); + + /* 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(u))); + + /* Be clean. */ + POLYBENCH_FREE_ARRAY(u); + POLYBENCH_FREE_ARRAY(v); + POLYBENCH_FREE_ARRAY(p); + POLYBENCH_FREE_ARRAY(q); + + return 0; +} diff --git a/codes/adi/adi.h b/codes/adi/adi.h new file mode 100644 index 0000000000000000000000000000000000000000..24fbabc20de095e241e603c88ad795312a20209a --- /dev/null +++ b/codes/adi/adi.h @@ -0,0 +1,80 @@ +/** + * 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 _ADI_H +# define _ADI_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(TSTEPS) && !defined(N) +/* Define sample dataset sizes. */ +# ifdef MINI_DATASET +# define TSTEPS 20 +# define N 20 +# endif + +# ifdef SMALL_DATASET +# define TSTEPS 40 +# define N 60 +# endif + +# ifdef MEDIUM_DATASET +# define TSTEPS 100 +# define N 200 +# endif + +# ifdef LARGE_DATASET +# define TSTEPS 500 +# define N 1000 +# endif + +# ifdef EXTRALARGE_DATASET +# define TSTEPS 1000 +# define N 2000 +# endif + + +#endif /* !(TSTEPS N) */ + +# define _PB_TSTEPS POLYBENCH_LOOP_BOUND(TSTEPS,tsteps) +# 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 /* !_ADI_H */