void * threadmain(void *args) { int i, idx; testfunc_t func; threaddata_t *td = (threaddata_t *) args; TEST_SRAND(((int)TIME()) * td->tid); thread_barrier(); if (!threadstress) MSG("tid=%3d> starting.", td->tid); for (i = 0; i < iters; i++) { idx = TEST_RAND(0,functions_num-1); func = test_functions[idx]; assert(func != NULL); func(td); if (td->ltid == 0 && !threadstress) TEST_PROGRESS_BAR(i, iters); } thread_barrier(); if (!threadstress) MSG("tid=%3d> done.", td->tid); return NULL; }
/* All nodes must get the same random sequence */ static void randomize(thread_data_t *td) { local_barrier(); if (td->local_id == 0) { int i; for (i=0; i<iters; ++i) { R[i] = TEST_RAND(0,1000000000); } } local_barrier(); }
int main(void) { int errors=0; printf("Testing examples for Chapter 7\n"); /* Section 7.1 */ TEST_B64(mul_64to64, gen_s64, gen_s64, 1); TEST_B64TO128(umul_64to128_arm7m, gen_s64, gen_s64, 1); TEST_B64TO128(umul_64to128_arm9e, gen_s64, gen_s64, 1); TEST_B64TO128(smul_64to128, gen_s64, gen_s64, 1); /* Section 7.2 */ TEST_U32TOB32(unorm_arm9e, gen_s32, 1); TEST_U32TOB32(snorm_arm9e, gen_s32, 1); TEST_U32TOB32(unorm_arm7m, gen_s32, 1); TEST_U32TOB32(unorm_arm7m_hash, gen_s32, 1); TEST_U32(ctz_arm9e, gen_s32_ctz, 1); TEST_U32(ctz_arm7m, gen_s32_ctz, 1); /* Section 7.3 */ TEST_B32TOB32(udiv_simple_test, gen_s32, gen_s32, 1); TEST_B32TOB32(udiv_32by32_arm7m, gen_s32, gen_s32, 1); TEST_B32TOB32(udiv_32by16_arm7m, gen_u15, gen_s32, 1); TEST_32_64TOB32(udiv_64by32_arm7m, gen_u31, gen_s64, 1); TEST_B32TOB32(udiv_32by32_arm9e, gen_s32, gen_s32, 1); TEST_B32(udiv_q15_arm9e, gen_u15, gen_u31, 1); TEST_B32(udiv_q31_arm9e, gen_u31, gen_s32, 1); TEST_B32TOB32(sdiv_32by32_arm7m, gen_s32, gen_s32, 1); /* Section 7.4 */ TEST_U32(usqr_simple_test, gen_s32, 1); TEST_U32(usqr_32, gen_s32, 1); TEST_U32(ucbr_32, gen_s32, 1); TEST_U32(rsqr_32, gen_s32, 2); /* Section 7.5 */ TEST_U32(ulog2_32, gen_s32, 2); TEST_U32(uexp2_32, gen_s32, 4); TEST_U32(sin_32, gen_s32, 4); TEST_U32(cos_32, gen_s32, 4); /* Section 7.6 */ TEST_U32(byte_reverse, gen_s32, 1); TEST_U32(byte_reverse_2reg, gen_s32, 1); TEST_U32(bit_count, gen_s32, 1); TEST_U32(bit_reverse, gen_s32, 1); TEST_U32(bit_spread, gen_s32, 1); TEST_U32(bit_rev_spread, gen_s32, 1); /* Section 7.7 */ TEST_U32(qsat_16, gen_s32, 1); TEST_B32(qshl_32, gen_s32, gen_shift, 1); TEST_B32(qshr_32, gen_s32, gen_shift, 1); TEST_B32(qadd_32, gen_s32, gen_s32, 1); TEST_B32(qsub_32, gen_s32, gen_s32, 1); TEST_B32(absa_32, gen_s32, gen_s32, 1); TEST_U32(qabs_32, gen_s32, 1); /* Section 7.8 */ TEST_RAND(rand_32); if (errors) { printf("Test finished with %d errors.\n", errors); return 1; } else { printf("Test passed.\n"); } return 0; }
int main(int argc, char **argv) { int outer_iterations = 0; int inner_iterations = 0; int seedoffset = 0; int numprocs, myproc, peerproc; int sender_p; char *shadow_region_1, *shadow_region_2; int i,j; char *local_base, *target_base; /* call startup */ GASNET_Safe(gasnet_init(&argc, &argv)); /* get SPMD info */ myproc = gasnet_mynode(); numprocs = gasnet_nodes(); if (argc > 1) segsize = atoi(argv[1]); if (!segsize) segsize = 1024*1000; if (argc > 2) outer_iterations = atoi(argv[2]); if (!outer_iterations) outer_iterations = 10; if (argc > 3) inner_iterations = atoi(argv[3]); if (!inner_iterations) inner_iterations = 10; if (argc > 4) seedoffset = atoi(argv[4]); GASNET_Safe(gasnet_attach(NULL, 0, TEST_SEGSZ, TEST_MINHEAPOFFSET)); test_init("testslice",0, "(segsize) (iterations) (# of sizes per iteration) (seed)"); /* parse arguments */ if (argc > 5) test_usage(); if(numprocs & 1) { MSG0("WARNING: This test requires an even number of nodes. Test skipped.\n"); gasnet_exit(0); /* exit 0 to prevent false negatives in test harnesses for smp-conduit */ } sender_p = !(myproc & 1); peerproc = myproc ^ 1; if (seedoffset == 0) { seedoffset = (((unsigned int)TIME()) & 0xFFFF); TEST_BCAST(&seedoffset, 0, &seedoffset, sizeof(&seedoffset)); } TEST_SRAND(myproc+seedoffset); MSG0("Running with segment size = %d outer iterations=%d inner iterations=%d seed=%d", segsize,outer_iterations, inner_iterations, seedoffset); BARRIER(); /* Allocate two shadow regions the same size as the segment */ shadow_region_1 = (char *) test_malloc(segsize); shadow_region_2 = (char *) test_malloc(segsize); /* Fill up the shadow region with random data */ for(i=0; i < segsize; i++) { shadow_region_1[i] = (char) TEST_RAND(0,255); } memset(shadow_region_2,0,segsize); /* Big loop performing the following */ for(i=0; i < outer_iterations; i++) { if(sender_p) { /* Pick a starting point anywhere in the segment */ int starting_point = TEST_RAND(0,(segsize-1)); local_base = TEST_SEG(myproc); target_base = TEST_SEG(peerproc); for(j=0; j < inner_iterations; j++) { /* Pick a length */ int len = TEST_RAND(1,segsize-starting_point); int remote_starting_point = TEST_RAND(0,segsize-len); int local_starting_point_1 = TEST_RAND(0,segsize-len); int local_starting_point_2 = TEST_RAND(0,segsize-len); /* Perform operations */ /* Out of segment put from shadow_region 1 to remote */ gasnet_put(peerproc,target_base+remote_starting_point,shadow_region_1 + starting_point,len); /* In segment get from remote to local segment */ gasnet_get(local_base+local_starting_point_1,peerproc,target_base+remote_starting_point,len); /* Verify */ assert_eq(shadow_region_1 + starting_point, local_base + local_starting_point_1, len,starting_point,i,j,"Out of segment put + in segment get"); /* Out of segment get from remote to shadow_region_2 (starting from 0) */ gasnet_get(shadow_region_2+local_starting_point_2,peerproc,target_base+remote_starting_point,len); /* Verify */ assert_eq(shadow_region_2+local_starting_point_2, shadow_region_1 + starting_point, len,starting_point,i,j,"Out of segment get"); } TEST_PROGRESS_BAR(i,outer_iterations); } BARRIER(); } if(sender_p && !failures) { MSG("testslice PASSED"); } gasnet_exit(0); return 0; }
int main(int argc, char **argv) { int outer_iterations = 0; int inner_iterations = 0; int seedoffset = 0; int numprocs, myproc; #if PLATFORM_COMPILER_CLANG // The addition of a gratuitous 'volatile' here has been observed to // work-around Bug 3630 in which Clang 4 and newer misoptimize this test. volatile int peerproc; #else int peerproc; #endif int sender_p; char *shadow_region_1, *shadow_region_2; int i,j; char *local_base, *target_base; /* call startup */ GASNET_Safe(gex_Client_Init(&myclient, &myep, &myteam, "testslice", &argc, &argv, 0)); /* get SPMD info */ myproc = gex_TM_QueryRank(myteam); numprocs = gex_TM_QuerySize(myteam); if (argc > 1) segsize = atoi(argv[1]); if (!segsize) segsize = 1024*1000; if (argc > 2) outer_iterations = atoi(argv[2]); if (!outer_iterations) outer_iterations = 10; if (argc > 3) inner_iterations = atoi(argv[3]); if (!inner_iterations) inner_iterations = 10; if (argc > 4) seedoffset = atoi(argv[4]); GASNET_Safe(gex_Segment_Attach(&mysegment, myteam, TEST_SEGSZ)); test_init("testslice",0, "(segsize) (iterations) (# of sizes per iteration) (seed)"); /* parse arguments */ if (argc > 5) test_usage(); if(numprocs & 1) { MSG0("WARNING: This test requires an even number of nodes. Test skipped.\n"); gasnet_exit(0); /* exit 0 to prevent false negatives in test harnesses for smp-conduit */ } sender_p = !(myproc & 1); peerproc = myproc ^ 1; if (seedoffset == 0) { seedoffset = (((unsigned int)TIME()) & 0xFFFF); TEST_BCAST(&seedoffset, 0, &seedoffset, sizeof(&seedoffset)); } TEST_SRAND(myproc+seedoffset); MSG0("Running with segment size = %d outer iterations=%d inner iterations=%d seed=%d", segsize,outer_iterations, inner_iterations, seedoffset); BARRIER(); /* Allocate two shadow regions the same size as the segment */ shadow_region_1 = (char *) test_malloc(segsize); shadow_region_2 = (char *) test_malloc(segsize); /* Fill up the shadow region with random data */ for(i=0;i < segsize;i++) { shadow_region_1[i] = (char) TEST_RAND(0,255); } memset(shadow_region_2,0,segsize); /* Big loop performing the following */ for(i=0;i < outer_iterations;i++) { if(sender_p) { /* Pick a starting point anywhere in the segment */ int starting_point = TEST_RAND(0,(segsize-1)); local_base = TEST_SEG(myproc); target_base = TEST_SEG(peerproc); for(j=0;j < inner_iterations;j++) { /* Pick a length */ int len = TEST_RAND(1,segsize-starting_point); int remote_starting_point = TEST_RAND(0,segsize-len); int local_starting_point_1 = TEST_RAND(0,segsize-len); int local_starting_point_2 = TEST_RAND(0,segsize-len); /* Perform operations */ /* Out of segment put from shadow_region 1 to remote */ gex_RMA_PutBlocking(myteam, peerproc,target_base+remote_starting_point,shadow_region_1 + starting_point,len, 0); /* In segment get from remote to local segment */ gex_RMA_GetBlocking(myteam, local_base+local_starting_point_1,peerproc,target_base+remote_starting_point,len, 0); /* Verify */ assert_eq(shadow_region_1 + starting_point, local_base + local_starting_point_1, len,starting_point,i,j,"Out of segment put + in segment get"); /* Out of segment get from remote to shadow_region_2 (starting from 0) */ gex_RMA_GetBlocking(myteam, shadow_region_2+local_starting_point_2,peerproc,target_base+remote_starting_point,len, 0); /* Verify */ assert_eq(shadow_region_2+local_starting_point_2, shadow_region_1 + starting_point, len,starting_point,i,j,"Out of segment get"); } TEST_PROGRESS_BAR(i,outer_iterations); } BARRIER(); } if(sender_p && !failures) { MSG("testslice PASSED"); } gasnet_exit(0); return 0; }