diff --git a/codes/heat-3d/heat-3d.c b/codes/heat-3d/heat-3d.c new file mode 100644 index 0000000000000000000000000000000000000000..b976459aca88490cbb6afa40879a9534688d4994 --- /dev/null +++ b/codes/heat-3d/heat-3d.c @@ -0,0 +1,130 @@ +/** + * 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 + */ +/* heat-3d.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 "heat-3d.h" + + +/* Array initialization. */ +static +void init_array (int n, + DATA_TYPE POLYBENCH_3D(A,N,N,N,n,n,n), + DATA_TYPE POLYBENCH_3D(B,N,N,N,n,n,n)) +{ + int i, j, k; + + for (i = 0; i < n; i++) + for (j = 0; j < n; j++) + for (k = 0; k < n; k++) + A[i][j][k] = B[i][j][k] = (DATA_TYPE) (i + j + (n-k))* 10 / (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_3D(A,N,N,N,n,n,n)) + +{ + int i, j, k; + + POLYBENCH_DUMP_START; + POLYBENCH_DUMP_BEGIN("A"); + for (i = 0; i < n; i++) + for (j = 0; j < n; j++) + for (k = 0; k < n; k++) { + if ((i * n * n + j * n + k) % 20 == 0) fprintf(POLYBENCH_DUMP_TARGET, "\n"); + fprintf(POLYBENCH_DUMP_TARGET, DATA_PRINTF_MODIFIER, A[i][j][k]); + } + POLYBENCH_DUMP_END("A"); + POLYBENCH_DUMP_FINISH; +} + +/* Main computational kernel. The whole function will be timed, + including the call and return. */ +static +void kernel_heat_3d(int tsteps, + int n, + DATA_TYPE POLYBENCH_3D(A,N,N,N,n,n,n), + DATA_TYPE POLYBENCH_3D(B,N,N,N,n,n,n)) +{ + int t, i, j, k; + +#pragma scop + for (t = 1; t <= TSTEPS; t++) { + for (i = 1; i < _PB_N-1; i++) { + for (j = 1; j < _PB_N-1; j++) { + for (k = 1; k < _PB_N-1; k++) { + B[i][j][k] = SCALAR_VAL(0.125) * (A[i+1][j][k] - SCALAR_VAL(2.0) * A[i][j][k] + A[i-1][j][k]) + + SCALAR_VAL(0.125) * (A[i][j+1][k] - SCALAR_VAL(2.0) * A[i][j][k] + A[i][j-1][k]) + + SCALAR_VAL(0.125) * (A[i][j][k+1] - SCALAR_VAL(2.0) * A[i][j][k] + A[i][j][k-1]) + + A[i][j][k]; + } + } + } + for (i = 1; i < _PB_N-1; i++) { + for (j = 1; j < _PB_N-1; j++) { + for (k = 1; k < _PB_N-1; k++) { + A[i][j][k] = SCALAR_VAL(0.125) * (B[i+1][j][k] - SCALAR_VAL(2.0) * B[i][j][k] + B[i-1][j][k]) + + SCALAR_VAL(0.125) * (B[i][j+1][k] - SCALAR_VAL(2.0) * B[i][j][k] + B[i][j-1][k]) + + SCALAR_VAL(0.125) * (B[i][j][k+1] - SCALAR_VAL(2.0) * B[i][j][k] + B[i][j][k-1]) + + B[i][j][k]; + } + } + } + } +#pragma endscop + +} + + +int main(int argc, char** argv) +{ + /* Retrieve problem size. */ + int n = N; + int tsteps = TSTEPS; + + /* Variable declaration/allocation. */ + POLYBENCH_3D_ARRAY_DECL(A, DATA_TYPE, N, N, N, n, n, n); + POLYBENCH_3D_ARRAY_DECL(B, DATA_TYPE, N, N, N, n, n, n); + + + /* Initialize array(s). */ + init_array (n, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B)); + + /* Start timer. */ + polybench_start_instruments; + + /* Run kernel. */ + kernel_heat_3d (tsteps, n, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B)); + + /* 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(A))); + + /* Be clean. */ + POLYBENCH_FREE_ARRAY(A); + + return 0; +} diff --git a/codes/heat-3d/heat-3d.h b/codes/heat-3d/heat-3d.h new file mode 100644 index 0000000000000000000000000000000000000000..37fb9fdf10cee457e66013d8f5452148179bbca5 --- /dev/null +++ b/codes/heat-3d/heat-3d.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 _HEAT_3D_H +# define _HEAT_3D_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 10 +# endif + +# ifdef SMALL_DATASET +# define TSTEPS 40 +# define N 20 +# endif + +# ifdef MEDIUM_DATASET +# define TSTEPS 100 +# define N 40 +# endif + +# ifdef LARGE_DATASET +# define TSTEPS 500 +# define N 120 +# endif + +# ifdef EXTRALARGE_DATASET +# define TSTEPS 1000 +# define N 200 +# 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 /* !_HEAT_3D_H */