/* ------------------------------------------------------------------------------------ */ void *doAll(void *ptr) { if (ptr) { if (recvr) GASNET_BLOCKUNTIL(done); } else { doAMShort(); doAMMed(); doAMLong(); doAMLongAsync(); if (recvr) GASNET_Safe(gasnet_AMRequestShort0(mynode, hidx_done_shorthandler)); } return NULL; }
/* ------------------------------------------------------------------------------------ */ void doAMShort(void) { GASNET_BEGIN_FUNCTION(); if (sender) { /* warm-up */ flag = 0; for (i=0; i < iters; i++) { GASNET_Safe(gasnet_AMRequestShort0(peer, hidx_ping_shorthandler_flood)); } GASNET_BLOCKUNTIL(flag == iters); GASNET_Safe(gasnet_AMRequestShort0(peer, hidx_ping_shorthandler)); GASNET_BLOCKUNTIL(flag == iters+1); } BARRIER(); /* ------------------------------------------------------------------------------------ */ if (TEST_SECTION_BEGIN_ENABLED() && sender) { int64_t start = TIME(); flag = -1; for (i=0; i < iters; i++) { GASNET_Safe(gasnet_AMRequestShort0(peer, hidx_ping_shorthandler)); GASNET_BLOCKUNTIL(flag == i); } report(" AMShort ping-pong roundtrip ReqRep",TIME() - start, iters, 0, 1); } BARRIER(); /* ------------------------------------------------------------------------------------ */ if (TEST_SECTION_ENABLED()) { int64_t start = TIME(); flag = -1; BARRIER(); if (sender && recvr) { assert(peer == mynode); for (i=0; i < iters; i++) { int lim = i << 1; GASNET_Safe(gasnet_AMRequestShort0(peer, hidx_pong_shorthandler)); GASNET_BLOCKUNTIL(flag == lim); lim++; GASNET_Safe(gasnet_AMRequestShort0(peer, hidx_pong_shorthandler)); GASNET_BLOCKUNTIL(flag == lim); } } else if (sender) { for (i=0; i < iters; i++) { GASNET_Safe(gasnet_AMRequestShort0(peer, hidx_pong_shorthandler)); GASNET_BLOCKUNTIL(flag == i); } } else if (recvr) { for (i=0; i < iters; i++) { GASNET_BLOCKUNTIL(flag == i); GASNET_Safe(gasnet_AMRequestShort0(peer, hidx_pong_shorthandler)); } } report(" AMShort ping-pong roundtrip ReqReq",TIME() - start, iters, 0, 1); if (mynode == 0) { printf("\n"); fflush(stdout); } } BARRIER(); /* ------------------------------------------------------------------------------------ */ if (TEST_SECTION_ENABLED()) { if (sender) { int64_t start = TIME(); flag = 0; BARRIER(); for (i=0; i < iters; i++) { GASNET_Safe(gasnet_AMRequestShort0(peer, hidx_pong_shorthandler_flood)); } if (recvr) GASNET_BLOCKUNTIL(flag == iters); BARRIER(); report(" AMShort flood one-way Req",TIME() - start, iters, 0, 0); } else { flag = 0; BARRIER(); GASNET_BLOCKUNTIL(flag == iters); BARRIER(); } if (mynode == 0) { printf("\n"); fflush(stdout); } } BARRIER(); /* ------------------------------------------------------------------------------------ */ if (TEST_SECTION_ENABLED() && sender) { int64_t start = TIME(); flag = 0; for (i=0; i < iters; i++) { GASNET_Safe(gasnet_AMRequestShort0(peer, hidx_ping_shorthandler_flood)); } GASNET_BLOCKUNTIL(flag == iters); report(" AMShort flood roundtrip ReqRep",TIME() - start, iters, 0, 1); if (mynode == 0) { printf("\n"); fflush(stdout); } } BARRIER(); }
static void * doTest(void *arg) { int warmups = MIN(100, iters/100); int64_t start,total; int result; int i = 0; if (arg) { /* I am a polling thread */ GASNET_BLOCKUNTIL(done); return NULL; } /* Warmup Named */ for (i=0; i < warmups; i++) { my_barrier_notify(i, 0); GASNET_Safe(my_barrier_wait(i, 0)); assert_always(!gasnet_barrier_result(&result)); } BARRIER(); start = TIME(); for (i=0; i < iters; i++) { my_barrier_notify(i, 0); GASNET_Safe(my_barrier_wait(i, 0)); } total = TIME() - start; BARRIER(); if (mynode == 0) { printf("Total time: %8.3f sec Avg Named Barrier latency: %8.3f us\n", ((float)total)/1000000, ((float)total)/iters); fflush(stdout); } BARRIER(); /* Warmup Anonymous */ for (i=0; i < warmups; i++) { my_barrier_notify(0, GASNET_BARRIERFLAG_ANONYMOUS); GASNET_Safe(my_barrier_wait(0, GASNET_BARRIERFLAG_ANONYMOUS)); assert_always(gasnet_barrier_result(&result)); } BARRIER(); start = TIME(); for (i=0; i < iters; i++) { my_barrier_notify(0, GASNET_BARRIERFLAG_ANONYMOUS); GASNET_Safe(my_barrier_wait(0, GASNET_BARRIERFLAG_ANONYMOUS)); } total = TIME() - start; BARRIER(); if (mynode == 0) { printf("Total time: %8.3f sec Avg Anon. Barrier latency: %8.3f us\n", ((float)total)/1000000, ((float)total)/iters); fflush(stdout); } BARRIER(); if (!PERFORM_MIXED_NAMED_ANON_TESTS) { if (mynode == 0) { MSG("WARNING: skipping tests which mix named and anonymous barriers, " "which are known to fail in this configuration"); } } else { int parity = (mynode & 1); /* Warmup Mixed */ for (i=0; i < warmups; i++, parity ^= 1) { int value = parity ? iters : 0; int flags = parity ? 0 : GASNET_BARRIERFLAG_ANONYMOUS; my_barrier_notify(value, flags); GASNET_Safe(my_barrier_wait(value, flags)); assert_always(!gasnet_barrier_result(&result) || (nodes == 1)); } BARRIER(); start = TIME(); for (i=0; i < iters; i++, parity ^= 1) { int value = parity ? iters : 0; int flags = parity ? 0 : GASNET_BARRIERFLAG_ANONYMOUS; my_barrier_notify(value, flags); GASNET_Safe(my_barrier_wait(value, flags)); } total = TIME() - start; BARRIER(); if (mynode == 0) { printf("Total time: %8.3f sec Avg Mixed Barrier latency: %8.3f us\n", ((float)total)/1000000, ((float)total)/iters); fflush(stdout); } } BARRIER(); #if TEST_UNNAMED_BARRIER /* Warmup Unnamed */ for (i=0; i < warmups; i++) { my_barrier_notify(0, GASNET_BARRIERFLAG_UNNAMED); GASNET_Safe(my_barrier_wait(0, GASNET_BARRIERFLAG_UNNAMED)); assert_always(gasnet_barrier_result(&result)); } BARRIER(); start = TIME(); for (i=0; i < iters; i++) { my_barrier_notify(0, GASNET_BARRIERFLAG_UNNAMED); GASNET_Safe(my_barrier_wait(0, GASNET_BARRIERFLAG_UNNAMED)); } total = TIME() - start; BARRIER(); if (mynode == 0) { printf("Total time: %8.3f sec Avg Uname Barrier latency: %8.3f us\n", ((float)total)/1000000, ((float)total)/iters); fflush(stdout); } BARRIER(); #endif GASNET_Safe(gasnet_AMRequestShort0(mynode, hidx_done_shorthandler)); return NULL; }