| #ifndef REDUCTION_H |
| #define REDUCTION_H |
| |
| #define DO_PRAGMA(x) _Pragma (#x) |
| |
| #define check_reduction_op(type, op, init, b, gwv_par, gwv_loop) \ |
| { \ |
| type res, vres; \ |
| res = (init); \ |
| DO_PRAGMA (acc parallel gwv_par copy (res)) \ |
| DO_PRAGMA (acc loop gwv_loop reduction (op:res)) \ |
| for (i = 0; i < n; i++) \ |
| res = res op (b); \ |
| \ |
| vres = (init); \ |
| for (i = 0; i < n; i++) \ |
| vres = vres op (b); \ |
| \ |
| if (res != vres) \ |
| abort (); \ |
| } |
| |
| #define check_reduction_macro(type, op, init, b, gwv_par, gwv_loop) \ |
| { \ |
| type res, vres; \ |
| res = (init); \ |
| DO_PRAGMA (acc parallel gwv_par copy(res)) \ |
| DO_PRAGMA (acc loop gwv_loop reduction (op:res)) \ |
| for (i = 0; i < n; i++) \ |
| res = op (res, (b)); \ |
| \ |
| vres = (init); \ |
| for (i = 0; i < n; i++) \ |
| vres = op (vres, (b)); \ |
| \ |
| if (res != vres) \ |
| abort (); \ |
| } |
| |
| #define max(a, b) (((a) > (b)) ? (a) : (b)) |
| #define min(a, b) (((a) < (b)) ? (a) : (b)) |
| |
| #endif |