1 #ifndef REDUCTION_H 2 #define REDUCTION_H 3 4 #define DO_PRAGMA(x) _Pragma (#x) 5 6 #define check_reduction_op(type, op, init, b, gwv_par, gwv_loop) \ 7 { \ 8 type res, vres; \ 9 res = (init); \ 10 DO_PRAGMA (acc parallel gwv_par copy (res)) \ 11 DO_PRAGMA (acc loop gwv_loop reduction (op:res)) \ 12 for (i = 0; i < n; i++) \ 13 res = res op (b); \ 14 \ 15 vres = (init); \ 16 for (i = 0; i < n; i++) \ 17 vres = vres op (b); \ 18 \ 19 if (res != vres) \ 20 abort (); \ 21 } 22 23 #define check_reduction_macro(type, op, init, b, gwv_par, gwv_loop) \ 24 { \ 25 type res, vres; \ 26 res = (init); \ 27 DO_PRAGMA (acc parallel gwv_par copy(res)) \ 28 DO_PRAGMA (acc loop gwv_loop reduction (op:res)) \ 29 for (i = 0; i < n; i++) \ 30 res = op (res, (b)); \ 31 \ 32 vres = (init); \ 33 for (i = 0; i < n; i++) \ 34 vres = op (vres, (b)); \ 35 \ 36 if (res != vres) \ 37 abort (); \ 38 } 39 40 #define max(a, b) (((a) > (b)) ? (a) : (b)) 41 #define min(a, b) (((a) < (b)) ? (a) : (b)) 42 43 #endif 44