| [a1acb0c5] | 1 | /**
|
|---|
| 2 | * polybench.h: This file is part of the PolyBench/C 3.2 test suite.
|
|---|
| 3 | *
|
|---|
| 4 | *
|
|---|
| 5 | * Contact: Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
|
|---|
| 6 | * Web address: http://polybench.sourceforge.net
|
|---|
| 7 | * License: /LICENSE.OSU.txt
|
|---|
| 8 | */
|
|---|
| 9 | /*
|
|---|
| 10 | * Polybench header for instrumentation.
|
|---|
| 11 | *
|
|---|
| 12 | * Programs must be compiled with `-I utilities utilities/polybench.c'
|
|---|
| 13 | *
|
|---|
| 14 | * Optionally, one can define:
|
|---|
| 15 | *
|
|---|
| 16 | * -DPOLYBENCH_TIME, to report the execution time,
|
|---|
| 17 | * OR (exclusive):
|
|---|
| 18 | * -DPOLYBENCH_PAPI, to use PAPI H/W counters (defined in polybench.c)
|
|---|
| 19 | *
|
|---|
| 20 | *
|
|---|
| 21 | * See README or utilities/polybench.c for additional options.
|
|---|
| 22 | *
|
|---|
| 23 | */
|
|---|
| 24 | #ifndef POLYBENCH_H
|
|---|
| 25 | # define POLYBENCH_H
|
|---|
| 26 |
|
|---|
| 27 | # include <stdlib.h>
|
|---|
| 28 |
|
|---|
| 29 | /* Array padding. By default, none is used. */
|
|---|
| 30 | # ifndef POLYBENCH_PADDING_FACTOR
|
|---|
| 31 | /* default: */
|
|---|
| 32 | # define POLYBENCH_PADDING_FACTOR 0
|
|---|
| 33 | # endif
|
|---|
| 34 |
|
|---|
| 35 |
|
|---|
| 36 | /* C99 arrays in function prototype. By default, do not use. */
|
|---|
| 37 | # ifdef POLYBENCH_USE_C99_PROTO
|
|---|
| 38 | # define POLYBENCH_C99_SELECT(x,y) y
|
|---|
| 39 | # else
|
|---|
| 40 | /* default: */
|
|---|
| 41 | # define POLYBENCH_C99_SELECT(x,y) x
|
|---|
| 42 | # endif
|
|---|
| 43 |
|
|---|
| 44 |
|
|---|
| 45 | /* Scalar loop bounds in SCoPs. By default, use parametric loop bounds. */
|
|---|
| 46 | # ifdef POLYBENCH_USE_SCALAR_LB
|
|---|
| 47 | # define POLYBENCH_LOOP_BOUND(x,y) x
|
|---|
| 48 | # else
|
|---|
| 49 | /* default: */
|
|---|
| 50 | # define POLYBENCH_LOOP_BOUND(x,y) y
|
|---|
| 51 | # endif
|
|---|
| 52 |
|
|---|
| 53 |
|
|---|
| 54 | /* Macros to reference an array. Generic for heap and stack arrays
|
|---|
| 55 | (C99). Each array dimensionality has his own macro, to be used at
|
|---|
| 56 | declaration or as a function argument.
|
|---|
| 57 | Example:
|
|---|
| 58 | int b[x] => POLYBENCH_1D_ARRAY(b, x)
|
|---|
| 59 | int A[N][N] => POLYBENCH_2D_ARRAY(A, N, N)
|
|---|
| 60 | */
|
|---|
| 61 | # ifndef POLYBENCH_STACK_ARRAYS
|
|---|
| 62 | # define POLYBENCH_ARRAY(x) *x
|
|---|
| 63 | # define POLYBENCH_FREE_ARRAY(x) free((void*)x);
|
|---|
| 64 | # define POLYBENCH_DECL_VAR(x) (*x)
|
|---|
| 65 | # else
|
|---|
| 66 | # define POLYBENCH_ARRAY(x) x
|
|---|
| 67 | # define POLYBENCH_FREE_ARRAY(x)
|
|---|
| 68 | # define POLYBENCH_DECL_VAR(x) x
|
|---|
| 69 | # endif
|
|---|
| 70 | /* Macros for using arrays in the function prototypes. */
|
|---|
| 71 | # define POLYBENCH_1D(var, dim1,ddim1) var[POLYBENCH_C99_SELECT(dim1,ddim1) + POLYBENCH_PADDING_FACTOR]
|
|---|
| 72 | # define POLYBENCH_2D(var, dim1, dim2, ddim1, ddim2) var[POLYBENCH_C99_SELECT(dim1,ddim1) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim2,ddim2) + POLYBENCH_PADDING_FACTOR]
|
|---|
| 73 | # define POLYBENCH_3D(var, dim1, dim2, dim3, ddim1, ddim2, ddim3) var[POLYBENCH_C99_SELECT(dim1,ddim1) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim2,ddim2) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim3,ddim3) + POLYBENCH_PADDING_FACTOR]
|
|---|
| 74 | # define POLYBENCH_4D(var, dim1, dim2, dim3, dim4, ddim1, ddim2, ddim3, ddim4) var[POLYBENCH_C99_SELECT(dim1,ddim1) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim2,ddim2) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim3,ddim3) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim4,ddim4) + POLYBENCH_PADDING_FACTOR]
|
|---|
| 75 | # define POLYBENCH_5D(var, dim1, dim2, dim3, dim4, dim5, ddim1, ddim2, ddim3, ddim4, ddim5) var[POLYBENCH_C99_SELECT(dim1,ddim1) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim2,ddim2) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim3,ddim3) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim4,ddim4) + POLYBENCH_PADDING_FACTOR][POLYBENCH_C99_SELECT(dim5,ddim5) + POLYBENCH_PADDING_FACTOR]
|
|---|
| 76 |
|
|---|
| 77 |
|
|---|
| 78 | /* Macros to allocate heap arrays.
|
|---|
| 79 | Example:
|
|---|
| 80 | polybench_alloc_2d_array(N, M, double) => allocates N x M x sizeof(double)
|
|---|
| 81 | and returns a pointer to the 2d array
|
|---|
| 82 | */
|
|---|
| 83 | # define POLYBENCH_ALLOC_1D_ARRAY(n1, type) \
|
|---|
| 84 | (type(*)[n1 + POLYBENCH_PADDING_FACTOR])polybench_alloc_data (n1 + POLYBENCH_PADDING_FACTOR, sizeof(type))
|
|---|
| 85 | # define POLYBENCH_ALLOC_2D_ARRAY(n1, n2, type) \
|
|---|
| 86 | (type(*)[n1 + POLYBENCH_PADDING_FACTOR][n2 + POLYBENCH_PADDING_FACTOR])polybench_alloc_data ((n1 + POLYBENCH_PADDING_FACTOR) * (n2 + POLYBENCH_PADDING_FACTOR), sizeof(type))
|
|---|
| 87 | # define POLYBENCH_ALLOC_3D_ARRAY(n1, n2, n3, type) \
|
|---|
| 88 | (type(*)[n1 + POLYBENCH_PADDING_FACTOR][n2 + POLYBENCH_PADDING_FACTOR][n3 + POLYBENCH_PADDING_FACTOR])polybench_alloc_data ((n1 + POLYBENCH_PADDING_FACTOR) * (n2 + POLYBENCH_PADDING_FACTOR) * (n3 + POLYBENCH_PADDING_FACTOR), sizeof(type))
|
|---|
| 89 | # define POLYBENCH_ALLOC_4D_ARRAY(n1, n2, n3, n4, type) \
|
|---|
| 90 | (type(*)[n1 + POLYBENCH_PADDING_FACTOR][n2 + POLYBENCH_PADDING_FACTOR][n3 + POLYBENCH_PADDING_FACTOR][n4 + POLYBENCH_PADDING_FACTOR])polybench_alloc_data ((n1 + POLYBENCH_PADDING_FACTOR) * (n2 + POLYBENCH_PADDING_FACTOR) * (n3 + POLYBENCH_PADDING_FACTOR) * (n4 + POLYBENCH_PADDING_FACTOR), sizeof(type))
|
|---|
| 91 | # define POLYBENCH_ALLOC_5D_ARRAY(n1, n2, n3, n4, n5, type) \
|
|---|
| 92 | (type(*)[n1 + POLYBENCH_PADDING_FACTOR][n2 + POLYBENCH_PADDING_FACTOR][n3 + POLYBENCH_PADDING_FACTOR][n4 + POLYBENCH_PADDING_FACTOR][n5 + POLYBENCH_PADDING_FACTOR])polybench_alloc_data ((n1 + POLYBENCH_PADDING_FACTOR) * (n2 + POLYBENCH_PADDING_FACTOR) * (n3 + POLYBENCH_PADDING_FACTOR) * (n4 + POLYBENCH_PADDING_FACTOR) * (n5 + POLYBENCH_PADDING_FACTOR), sizeof(type))
|
|---|
| 93 |
|
|---|
| 94 | /* Macros for array declaration. */
|
|---|
| 95 | # ifndef POLYBENCH_STACK_ARRAYS
|
|---|
| 96 | # define POLYBENCH_1D_ARRAY_DECL(var, type, dim1, ddim1) \
|
|---|
| 97 | type POLYBENCH_1D(POLYBENCH_DECL_VAR(var), dim1, ddim1); \
|
|---|
| 98 | var = POLYBENCH_ALLOC_1D_ARRAY(POLYBENCH_C99_SELECT(dim1, ddim1), type);
|
|---|
| 99 | # define POLYBENCH_2D_ARRAY_DECL(var, type, dim1, dim2, ddim1, ddim2) \
|
|---|
| 100 | type POLYBENCH_2D(POLYBENCH_DECL_VAR(var), dim1, dim2, ddim1, ddim2); \
|
|---|
| 101 | var = POLYBENCH_ALLOC_2D_ARRAY(POLYBENCH_C99_SELECT(dim1, ddim1), POLYBENCH_C99_SELECT(dim2, ddim2), type);
|
|---|
| 102 | # define POLYBENCH_3D_ARRAY_DECL(var, type, dim1, dim2, dim3, ddim1, ddim2, ddim3) \
|
|---|
| 103 | type POLYBENCH_3D(POLYBENCH_DECL_VAR(var), dim1, dim2, dim3, ddim1, ddim2, ddim3); \
|
|---|
| 104 | var = POLYBENCH_ALLOC_3D_ARRAY(POLYBENCH_C99_SELECT(dim1, ddim1), POLYBENCH_C99_SELECT(dim2, ddim2), POLYBENCH_C99_SELECT(dim3, ddim3), type);
|
|---|
| 105 | # define POLYBENCH_4D_ARRAY_DECL(var, type, dim1, dim2, dim3, dim4, ddim1, ddim2, ddim3, ddim4) \
|
|---|
| 106 | type POLYBENCH_4D(POLYBENCH_DECL_VAR(var), dim1, dim2, ,dim3, dim4, ddim1, ddim2, ddim3, ddim4); \
|
|---|
| 107 | var = POLYBENCH_ALLOC_4D_ARRAY(POLYBENCH_C99_SELECT(dim1, ddim1), POLYBENCH_C99_SELECT(dim2, ddim2), POLYBENCH_C99_SELECT(dim3, ddim3), POLYBENCH_C99_SELECT(dim4, ddim4), type);
|
|---|
| 108 | # define POLYBENCH_5D_ARRAY_DECL(var, type, dim1, dim2, dim3, dim4, dim5, ddim1, ddim2, ddim3, ddim4, ddim5) \
|
|---|
| 109 | type POLYBENCH_5D(POLYBENCH_DECL_VAR(var), dim1, dim2, dim3, dim4, dim5, ddim1, ddim2, ddim3, ddim4, ddim5); \
|
|---|
| 110 | var = POLYBENCH_ALLOC_5D_ARRAY(POLYBENCH_C99_SELECT(dim1, ddim1), POLYBENCH_C99_SELECT(dim2, ddim2), POLYBENCH_C99_SELECT(dim3, ddim3), POLYBENCH_C99_SELECT(dim4, ddim4), POLYBENCH_C99_SELECT(dim5, ddim5), type);
|
|---|
| 111 | # else
|
|---|
| 112 | # define POLYBENCH_1D_ARRAY_DECL(var, type, dim1, ddim1) \
|
|---|
| 113 | type POLYBENCH_1D(POLYBENCH_DECL_VAR(var), dim1, ddim1);
|
|---|
| 114 | # define POLYBENCH_2D_ARRAY_DECL(var, type, dim1, dim2, ddim1, ddim2) \
|
|---|
| 115 | type POLYBENCH_2D(POLYBENCH_DECL_VAR(var), dim1, dim2, ddim1, ddim2);
|
|---|
| 116 | # define POLYBENCH_3D_ARRAY_DECL(var, type, dim1, dim2, dim3, ddim1, ddim2, ddim3) \
|
|---|
| 117 | type POLYBENCH_3D(POLYBENCH_DECL_VAR(var), dim1, dim2, dim3, ddim1, ddim2, ddim3);
|
|---|
| 118 | # define POLYBENCH_4D_ARRAY_DECL(var, type, dim1, dim2, dim3, dim4, ddim1, ddim2, ddim3, ddim4) \
|
|---|
| 119 | type POLYBENCH_4D(POLYBENCH_DECL_VAR(var), dim1, dim2, dim3, dim4, ddim1, ddim2, ddim3, ddim4);
|
|---|
| 120 | # define POLYBENCH_5D_ARRAY_DECL(var, type, dim1, dim2, dim3, dim4, dim5, ddim1, ddim2, ddim3, ddim4, ddim5) \
|
|---|
| 121 | type POLYBENCH_5D(POLYBENCH_DECL_VAR(var), dim1, dim2, dim3, dim4, dim5, ddim1, ddim2, ddim3, ddim4, ddim5);
|
|---|
| 122 | # endif
|
|---|
| 123 |
|
|---|
| 124 |
|
|---|
| 125 | /* Dead-code elimination macros. Use argc/argv for the run-time check. */
|
|---|
| 126 | # ifndef POLYBENCH_DUMP_ARRAYS
|
|---|
| 127 | # define POLYBENCH_DCE_ONLY_CODE if (argc > 42 && ! strcmp(argv[0], ""))
|
|---|
| 128 | # else
|
|---|
| 129 | # define POLYBENCH_DCE_ONLY_CODE
|
|---|
| 130 | # endif
|
|---|
| 131 |
|
|---|
| 132 | # define polybench_prevent_dce(func) \
|
|---|
| 133 | POLYBENCH_DCE_ONLY_CODE \
|
|---|
| 134 | func
|
|---|
| 135 |
|
|---|
| 136 |
|
|---|
| 137 | /* Performance-related instrumentation. See polybench.c */
|
|---|
| 138 | # define polybench_start_instruments
|
|---|
| 139 | # define polybench_stop_instruments
|
|---|
| 140 | # define polybench_print_instruments
|
|---|
| 141 |
|
|---|
| 142 |
|
|---|
| 143 | /* PAPI support. */
|
|---|
| 144 | # ifdef POLYBENCH_PAPI
|
|---|
| 145 | extern const unsigned int polybench_papi_eventlist[];
|
|---|
| 146 | # undef polybench_start_instruments
|
|---|
| 147 | # undef polybench_stop_instruments
|
|---|
| 148 | # undef polybench_print_instruments
|
|---|
| 149 | # define polybench_set_papi_thread_report(x) \
|
|---|
| 150 | polybench_papi_counters_threadid = x;
|
|---|
| 151 | # define polybench_start_instruments \
|
|---|
| 152 | polybench_prepare_instruments(); \
|
|---|
| 153 | polybench_papi_init(); \
|
|---|
| 154 | int evid; \
|
|---|
| 155 | for (evid = 0; polybench_papi_eventlist[evid] != 0; evid++) \
|
|---|
| 156 | { \
|
|---|
| 157 | if (polybench_papi_start_counter(evid)) \
|
|---|
| 158 | continue; \
|
|---|
| 159 |
|
|---|
| 160 | # define polybench_stop_instruments \
|
|---|
| 161 | polybench_papi_stop_counter(evid); \
|
|---|
| 162 | } \
|
|---|
| 163 | polybench_papi_close(); \
|
|---|
| 164 |
|
|---|
| 165 | # define polybench_print_instruments polybench_papi_print();
|
|---|
| 166 | # endif
|
|---|
| 167 |
|
|---|
| 168 |
|
|---|
| 169 | /* Timing support. */
|
|---|
| 170 | # if defined(POLYBENCH_TIME) || defined(POLYBENCH_GFLOPS)
|
|---|
| 171 | # undef polybench_start_instruments
|
|---|
| 172 | # undef polybench_stop_instruments
|
|---|
| 173 | # undef polybench_print_instruments
|
|---|
| 174 | # define polybench_start_instruments polybench_timer_start();
|
|---|
| 175 | # define polybench_stop_instruments polybench_timer_stop();
|
|---|
| 176 | # define polybench_print_instruments polybench_timer_print();
|
|---|
| 177 | extern double polybench_program_total_flops;
|
|---|
| 178 | extern void polybench_timer_start();
|
|---|
| 179 | extern void polybench_timer_stop();
|
|---|
| 180 | extern void polybench_timer_print();
|
|---|
| 181 | # endif
|
|---|
| 182 |
|
|---|
| 183 | /* Function declaration. */
|
|---|
| 184 | # ifdef POLYBENCH_TIME
|
|---|
| 185 | extern void polybench_timer_start();
|
|---|
| 186 | extern void polybench_timer_stop();
|
|---|
| 187 | extern void polybench_timer_print();
|
|---|
| 188 | # endif
|
|---|
| 189 |
|
|---|
| 190 | # ifdef POLYBENCH_PAPI
|
|---|
| 191 | extern void polybench_prepare_instruments();
|
|---|
| 192 | extern int polybench_papi_start_counter(int evid);
|
|---|
| 193 | extern void polybench_papi_stop_counter(int evid);
|
|---|
| 194 | extern void polybench_papi_init();
|
|---|
| 195 | extern void polybench_papi_close();
|
|---|
| 196 | extern void polybench_papi_print();
|
|---|
| 197 | # endif
|
|---|
| 198 |
|
|---|
| 199 | /* Function prototypes. */
|
|---|
| 200 | extern void* polybench_alloc_data(unsigned long long int n, int elt_size);
|
|---|
| 201 |
|
|---|
| 202 |
|
|---|
| 203 | #endif /* !POLYBENCH_H */
|
|---|