From 96dd6e47e1f6aa13af644d5f006512f5e56eb815 Mon Sep 17 00:00:00 2001 From: Daniel Maier <daniel.maier@tu-berlin.de> Date: Mon, 29 Oct 2018 15:32:27 +0100 Subject: [PATCH] 3mm application --- codes/3mm/3mm.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++++ codes/3mm/3mm.h | 98 ++++++++++++++++++++++++++++ 2 files changed, 267 insertions(+) create mode 100644 codes/3mm/3mm.c create mode 100644 codes/3mm/3mm.h diff --git a/codes/3mm/3mm.c b/codes/3mm/3mm.c new file mode 100644 index 0000000..d67178b --- /dev/null +++ b/codes/3mm/3mm.c @@ -0,0 +1,169 @@ +/** + * 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 + */ +/* 3mm.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 "3mm.h" + + +/* Array initialization. */ +static +void init_array(int ni, int nj, int nk, int nl, int nm, + DATA_TYPE POLYBENCH_2D(A,NI,NK,ni,nk), + DATA_TYPE POLYBENCH_2D(B,NK,NJ,nk,nj), + DATA_TYPE POLYBENCH_2D(C,NJ,NM,nj,nm), + DATA_TYPE POLYBENCH_2D(D,NM,NL,nm,nl)) +{ + int i, j; + + for (i = 0; i < ni; i++) + for (j = 0; j < nk; j++) + A[i][j] = (DATA_TYPE) ((i*j+1) % ni) / (5*ni); + for (i = 0; i < nk; i++) + for (j = 0; j < nj; j++) + B[i][j] = (DATA_TYPE) ((i*(j+1)+2) % nj) / (5*nj); + for (i = 0; i < nj; i++) + for (j = 0; j < nm; j++) + C[i][j] = (DATA_TYPE) (i*(j+3) % nl) / (5*nl); + for (i = 0; i < nm; i++) + for (j = 0; j < nl; j++) + D[i][j] = (DATA_TYPE) ((i*(j+2)+2) % nk) / (5*nk); +} + + +/* 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 ni, int nl, + DATA_TYPE POLYBENCH_2D(G,NI,NL,ni,nl)) +{ + int i, j; + + POLYBENCH_DUMP_START; + POLYBENCH_DUMP_BEGIN("G"); + for (i = 0; i < ni; i++) + for (j = 0; j < nl; j++) { + if ((i * ni + j) % 20 == 0) fprintf (POLYBENCH_DUMP_TARGET, "\n"); + fprintf (POLYBENCH_DUMP_TARGET, DATA_PRINTF_MODIFIER, G[i][j]); + } + POLYBENCH_DUMP_END("G"); + POLYBENCH_DUMP_FINISH; +} + + +/* Main computational kernel. The whole function will be timed, + including the call and return. */ +static +void kernel_3mm(int ni, int nj, int nk, int nl, int nm, + DATA_TYPE POLYBENCH_2D(E,NI,NJ,ni,nj), + DATA_TYPE POLYBENCH_2D(A,NI,NK,ni,nk), + DATA_TYPE POLYBENCH_2D(B,NK,NJ,nk,nj), + DATA_TYPE POLYBENCH_2D(F,NJ,NL,nj,nl), + DATA_TYPE POLYBENCH_2D(C,NJ,NM,nj,nm), + DATA_TYPE POLYBENCH_2D(D,NM,NL,nm,nl), + DATA_TYPE POLYBENCH_2D(G,NI,NL,ni,nl)) +{ + int i, j, k; + +#pragma scop + /* E := A*B */ + for (i = 0; i < _PB_NI; i++) + for (j = 0; j < _PB_NJ; j++) + { + E[i][j] = SCALAR_VAL(0.0); + for (k = 0; k < _PB_NK; ++k) + E[i][j] += A[i][k] * B[k][j]; + } + /* F := C*D */ + for (i = 0; i < _PB_NJ; i++) + for (j = 0; j < _PB_NL; j++) + { + F[i][j] = SCALAR_VAL(0.0); + for (k = 0; k < _PB_NM; ++k) + F[i][j] += C[i][k] * D[k][j]; + } + /* G := E*F */ + for (i = 0; i < _PB_NI; i++) + for (j = 0; j < _PB_NL; j++) + { + G[i][j] = SCALAR_VAL(0.0); + for (k = 0; k < _PB_NJ; ++k) + G[i][j] += E[i][k] * F[k][j]; + } +#pragma endscop + +} + + +int main(int argc, char** argv) +{ + /* Retrieve problem size. */ + int ni = NI; + int nj = NJ; + int nk = NK; + int nl = NL; + int nm = NM; + + /* Variable declaration/allocation. */ + POLYBENCH_2D_ARRAY_DECL(E, DATA_TYPE, NI, NJ, ni, nj); + POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, NI, NK, ni, nk); + POLYBENCH_2D_ARRAY_DECL(B, DATA_TYPE, NK, NJ, nk, nj); + POLYBENCH_2D_ARRAY_DECL(F, DATA_TYPE, NJ, NL, nj, nl); + POLYBENCH_2D_ARRAY_DECL(C, DATA_TYPE, NJ, NM, nj, nm); + POLYBENCH_2D_ARRAY_DECL(D, DATA_TYPE, NM, NL, nm, nl); + POLYBENCH_2D_ARRAY_DECL(G, DATA_TYPE, NI, NL, ni, nl); + + /* Initialize array(s). */ + init_array (ni, nj, nk, nl, nm, + POLYBENCH_ARRAY(A), + POLYBENCH_ARRAY(B), + POLYBENCH_ARRAY(C), + POLYBENCH_ARRAY(D)); + + /* Start timer. */ + polybench_start_instruments; + + /* Run kernel. */ + kernel_3mm (ni, nj, nk, nl, nm, + POLYBENCH_ARRAY(E), + POLYBENCH_ARRAY(A), + POLYBENCH_ARRAY(B), + POLYBENCH_ARRAY(F), + POLYBENCH_ARRAY(C), + POLYBENCH_ARRAY(D), + POLYBENCH_ARRAY(G)); + + /* 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(ni, nl, POLYBENCH_ARRAY(G))); + + /* Be clean. */ + POLYBENCH_FREE_ARRAY(E); + POLYBENCH_FREE_ARRAY(A); + POLYBENCH_FREE_ARRAY(B); + POLYBENCH_FREE_ARRAY(F); + POLYBENCH_FREE_ARRAY(C); + POLYBENCH_FREE_ARRAY(D); + POLYBENCH_FREE_ARRAY(G); + + return 0; +} diff --git a/codes/3mm/3mm.h b/codes/3mm/3mm.h new file mode 100644 index 0000000..8cc464e --- /dev/null +++ b/codes/3mm/3mm.h @@ -0,0 +1,98 @@ +/** + * 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 _3MM_H +# define _3MM_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(NI) && !defined(NJ) && !defined(NK) && !defined(NL) && !defined(NM) +/* Define sample dataset sizes. */ +# ifdef MINI_DATASET +# define NI 16 +# define NJ 18 +# define NK 20 +# define NL 22 +# define NM 24 +# endif + +# ifdef SMALL_DATASET +# define NI 40 +# define NJ 50 +# define NK 60 +# define NL 70 +# define NM 80 +# endif + +# ifdef MEDIUM_DATASET +# define NI 180 +# define NJ 190 +# define NK 200 +# define NL 210 +# define NM 220 +# endif + +# ifdef LARGE_DATASET +# define NI 800 +# define NJ 900 +# define NK 1000 +# define NL 1100 +# define NM 1200 +# endif + +# ifdef EXTRALARGE_DATASET +# define NI 1600 +# define NJ 1800 +# define NK 2000 +# define NL 2200 +# define NM 2400 +# endif + + +#endif /* !(NI NJ NK NL NM) */ + +# define _PB_NI POLYBENCH_LOOP_BOUND(NI,ni) +# define _PB_NJ POLYBENCH_LOOP_BOUND(NJ,nj) +# define _PB_NK POLYBENCH_LOOP_BOUND(NK,nk) +# define _PB_NL POLYBENCH_LOOP_BOUND(NL,nl) +# define _PB_NM POLYBENCH_LOOP_BOUND(NM,nm) + + +/* 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 /* !_3MM_H */ -- GitLab