blob: d929bfd80a4fb380b9489e79e68c328a4349c859 [file] [log] [blame]
/* Test dispatch of events to callbacks. */
#undef NDEBUG
#include <assert.h>
#include <acc_prof.h>
/* 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;
}