/* Test dispatch of events to callbacks. */ #undef NDEBUG #include #include /* Use explicit 'copyin' clauses, to work around "'firstprivate' optimizations", which will cause the value at the point of call to be used (*before* any potential modifications done in callbacks), as opposed to its address being taken, which then later gets dereferenced (*after* any modifications done in callbacks). */ #define COPYIN(...) copyin(__VA_ARGS__) #define DEBUG_printf(...) //__builtin_printf (__VA_ARGS__) static int state = -1; #define STATE_OP(state, op) \ do \ { \ typeof (state) state_o = (state); \ (void) state_o; \ (state)op; \ DEBUG_printf("state: %d -> %d\n", state_o, (state)); \ } \ while (0) static void cb_compute_construct_start_1 (acc_prof_info *prof_info, acc_event_info *event_info, acc_api_info *api_info) { DEBUG_printf ("%s\n", __FUNCTION__); assert (state == 0 || state == 10 || state == 30 || state == 41 || state == 51 || state == 91 || state == 101 || state == 151); STATE_OP (state, ++); } static void cb_compute_construct_start_2 (acc_prof_info *prof_info, acc_event_info *event_info, acc_api_info *api_info) { DEBUG_printf ("%s\n", __FUNCTION__); assert (state == 1 || state == 11 || state == 40 || state == 50 || state == 90 || state == 100 || state == 150); STATE_OP (state, ++); } static void cb_compute_construct_end_1 (acc_prof_info *prof_info, acc_event_info *event_info, acc_api_info *api_info) { DEBUG_printf ("%s\n", __FUNCTION__); assert (state == 14 || state == 21 || state == 32 || state == 42 || state == 80 || state == 103 || state == 152); STATE_OP (state, ++); } static void cb_compute_construct_end_2 (acc_prof_info *prof_info, acc_event_info *event_info, acc_api_info *api_info) { DEBUG_printf ("%s\n", __FUNCTION__); assert (state == 13 || state == 43 || state == 102 || state == 154); STATE_OP (state, ++); } static void cb_compute_construct_end_3 (acc_prof_info *prof_info, acc_event_info *event_info, acc_api_info *api_info) { DEBUG_printf ("%s\n", __FUNCTION__); assert (state == 12 || state == 20 || state == 31 || state == 44 || state == 81 || state == 104 || state == 153); STATE_OP (state, ++); } static acc_prof_reg reg; static acc_prof_reg unreg; static acc_prof_lookup_func lookup; void acc_register_library (acc_prof_reg reg_, acc_prof_reg unreg_, acc_prof_lookup_func lookup_) { DEBUG_printf ("%s\n", __FUNCTION__); reg = reg_; unreg = unreg_; lookup = lookup_; } int main() { acc_register_library (acc_prof_register, acc_prof_unregister, acc_prof_lookup); STATE_OP (state, = 0); reg (acc_ev_compute_construct_start, cb_compute_construct_start_1, acc_reg); reg (acc_ev_compute_construct_start, cb_compute_construct_start_1, acc_reg); reg (acc_ev_compute_construct_start, cb_compute_construct_start_2, acc_reg); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 2); } assert (state == 2); STATE_OP (state, = 10); reg (acc_ev_compute_construct_end, cb_compute_construct_end_1, acc_reg); reg (acc_ev_compute_construct_end, cb_compute_construct_end_2, acc_reg); reg (acc_ev_compute_construct_end, cb_compute_construct_end_3, acc_reg); reg (acc_ev_compute_construct_end, cb_compute_construct_end_2, acc_reg); reg (acc_ev_compute_construct_end, cb_compute_construct_end_3, acc_reg); reg (acc_ev_compute_construct_end, cb_compute_construct_end_3, acc_reg); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 12); } assert (state == 15); STATE_OP (state, = 20); unreg (acc_ev_compute_construct_start, cb_compute_construct_start_1, acc_toggle); unreg (acc_ev_compute_construct_start, cb_compute_construct_start_2, acc_toggle); unreg (acc_ev_compute_construct_start, cb_compute_construct_start_1, acc_reg); unreg (acc_ev_compute_construct_start, cb_compute_construct_start_2, acc_reg); unreg (acc_ev_compute_construct_end, cb_compute_construct_end_1, acc_toggle); unreg (acc_ev_compute_construct_end, cb_compute_construct_end_2, acc_toggle); unreg (acc_ev_compute_construct_end, cb_compute_construct_end_3, acc_toggle); unreg (acc_ev_compute_construct_end, cb_compute_construct_end_2, acc_reg); unreg (acc_ev_compute_construct_end, cb_compute_construct_end_2, acc_reg); unreg (acc_ev_compute_construct_end, cb_compute_construct_end_2, acc_toggle); reg (acc_ev_compute_construct_end, cb_compute_construct_end_2, acc_toggle); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 20); } assert (state == 20); STATE_OP (state, = 30); reg (acc_ev_compute_construct_start, cb_compute_construct_start_1, acc_toggle); reg (acc_ev_compute_construct_start, cb_compute_construct_start_2, acc_toggle); reg (acc_ev_compute_construct_end, cb_compute_construct_end_1, acc_toggle); reg (acc_ev_compute_construct_end, cb_compute_construct_end_2, acc_toggle); reg (acc_ev_compute_construct_end, cb_compute_construct_end_3, acc_toggle); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 31); } assert (state == 33); STATE_OP (state, = 40); reg (acc_ev_compute_construct_start, cb_compute_construct_start_2, acc_reg); unreg (acc_ev_compute_construct_start, cb_compute_construct_start_1, acc_reg); reg (acc_ev_compute_construct_start, cb_compute_construct_start_1, acc_reg); unreg (acc_ev_compute_construct_end, cb_compute_construct_end_3, acc_reg); unreg (acc_ev_compute_construct_end, cb_compute_construct_end_3, acc_reg); reg (acc_ev_compute_construct_end, cb_compute_construct_end_2, acc_reg); unreg (acc_ev_compute_construct_end, cb_compute_construct_end_1, acc_reg); reg (acc_ev_compute_construct_end, cb_compute_construct_end_1, acc_reg); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 42); } assert (state == 45); STATE_OP (state, = 50); unreg (acc_ev_compute_construct_end, NULL, acc_toggle); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 52); } assert (state == 52); STATE_OP (state, = 60); unreg (acc_ev_compute_construct_end, NULL, acc_toggle); unreg (/* TODO */ (acc_event_t) 0, NULL, acc_toggle_per_thread); unreg (/* TODO */ (acc_event_t) 0, NULL, acc_toggle_per_thread); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 60); } assert (state == 60); STATE_OP (state, = 70); unreg (acc_ev_compute_construct_start, NULL, acc_toggle); reg (/* TODO */ (acc_event_t) 0, NULL, acc_toggle_per_thread); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 70); } assert (state == 70); STATE_OP (state, = 80); unreg (acc_ev_compute_construct_end, cb_compute_construct_end_2, acc_reg); reg (acc_ev_compute_construct_end, NULL, acc_toggle); reg (/* TODO */ (acc_event_t) 0, NULL, acc_toggle_per_thread); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 80); } assert (state == 82); STATE_OP (state, = 90); reg (acc_ev_compute_construct_start, NULL, acc_toggle); unreg (acc_ev_compute_construct_end, NULL, acc_toggle); reg (acc_ev_compute_construct_end, cb_compute_construct_end_2, acc_reg); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 92); } assert (state == 92); STATE_OP (state, = 100); reg (acc_ev_compute_construct_end, NULL, acc_toggle); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 102); } assert (state == 105); STATE_OP (state, = 110); unreg (/* TODO */ (acc_event_t) 0, NULL, acc_toggle); unreg (/* TODO */ (acc_event_t) 0, NULL, acc_toggle); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 110); } assert (state == 110); STATE_OP (state, = 120); unreg (/* TODO */ (acc_event_t) 0, NULL, acc_toggle_per_thread); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 120); } assert (state == 120); STATE_OP (state, = 130); unreg (acc_ev_compute_construct_end, cb_compute_construct_end_3, acc_reg); reg (acc_ev_compute_construct_end, cb_compute_construct_end_3, acc_reg); reg (/* TODO */ (acc_event_t) 0, NULL, acc_toggle); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 130); } assert (state == 130); STATE_OP (state, = 140); unreg (acc_ev_compute_construct_start, cb_compute_construct_start_1, acc_reg); reg (acc_ev_compute_construct_start, cb_compute_construct_start_1, acc_reg); unreg (acc_ev_compute_construct_end, cb_compute_construct_end_1, acc_reg); reg (acc_ev_compute_construct_end, cb_compute_construct_end_1, acc_reg); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 140); } assert (state == 140); STATE_OP (state, = 150); reg (/* TODO */ (acc_event_t) 0, NULL, acc_toggle_per_thread); { int state_init; #pragma acc parallel COPYIN(state) copyout(state_init) { state_init = state; } assert (state_init == 152); } assert (state == 155); return 0; }