Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
/* 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();
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
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;

}
Ejemplo n.º 5
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;

}