int main() { int i,j; int me, npes; int success0, success1, success2, success3, success4, success5, success6; success0 = success1 = success2 = success3 = success4 = success5 = success6 = 0; start_pes(0); me = _my_pe(); npes = _num_pes(); for (i = 0; i < _SHMEM_REDUCE_SYNC_SIZE; i += 1) { pSync[i] = _SHMEM_SYNC_VALUE; pSync1[i] = _SHMEM_SYNC_VALUE; } for (i = 0; i < N; i += 1) { src0[i] = src1[i] = src2[i] = src3[i] = src4[i] = src5[i] = src6[i] = me + i; } /*Test MAX: shmem_double_max_to_all, shmem_float_max_to_all, shmem_int_max_to_all, shmem_long_max_to_all, shmem_longdouble_max_to_all, shmem_longlong_max_to_all, shmem_short_max_to_all */ shmem_barrier_all(); shmem_short_max_to_all(dst0, src0, N, 0, 0, npes, pWrk0, pSync); shmem_int_max_to_all(dst1, src1, N, 0, 0, npes, pWrk1, pSync1); shmem_long_max_to_all(dst2, src2, N, 0, 0, npes, pWrk2, pSync); shmem_float_max_to_all(dst3, src3, N, 0, 0, npes, pWrk3, pSync1); shmem_double_max_to_all(dst4, src4, N, 0, 0, npes, pWrk4, pSync); shmem_longdouble_max_to_all(dst5, src5, N, 0, 0, npes, pWrk5, pSync1); shmem_longlong_max_to_all(dst6, src6, N, 0, 0, npes, pWrk6, pSync); if(me == 0){ for (i = 0,j=-1; i < N; i++,j++) { if(dst0[i] != npes+j) success0 =1; if(dst1[i] != npes+j) success1 =1; if(dst2[i] != npes+j) success2 =1; if(dst3[i] != npes+j) success3 =1; if(dst4[i] != npes+j) success4 =1; if(dst5[i] != npes+j) success5 =1; if(dst6[i] != npes+j) success6 =1; } if(success0==1){ printf("Reduction operation shmem_short_max_to_all: Failed\n"); } else{ printf("Reduction operation shmem_short_max_to_all: Passed\n"); } if(success1==1){ printf("Reduction operation shmem_int_max_to_all: Failed\n"); } else{ printf("Reduction operation shmem_int_max_to_all: Passed\n"); } if(success2==1){ printf("Reduction operation shmem_long_max_to_all: Failed\n"); } else{ printf("Reduction operation shmem_long_max_to_all: Passed\n"); } if(success3==1){ printf("Reduction operation shmem_float_max_to_all: Failed\n"); } else{ printf("Reduction operation shmem_float_max_to_all: Passed\n"); } if(success4==1){ printf("Reduction operation shmem_double_max_to_all: Failed\n"); } else{ printf("Reduction operation shmem_double_max_to_all: Passed\n"); } if(success5==1){ printf("Reduction operation shmem_longdouble_max_to_all: Failed\n"); } else{ printf("Reduction operation shmem_longdouble_max_to_all: Passed\n"); } if(success6==1){ printf("Reduction operation shmem_longlong_max_to_all: Failed\n"); } else{ printf("Reduction operation shmem_longlong_max_to_all: Passed\n"); } } /*Test MIN: shmem_double_min_to_all, shmem_float_min_to_all, shmem_int_min_to_all, shmem_long_min_to_all, shmem_longdouble_min_to_all, shmem_longlong_min_to_all, shmem_short_min_to_all*/ success0 = success1 = success2 = success3 = success4 = success5 = success6 = 0; for (i = 0; i < N; i += 1) { src0[i] = src1[i] = src2[i] = src3[i] = src4[i] = src5[i] = src6[i] = me + i; } for (i = 0; i < N; i += 1) { dst0[i] = -9; dst1[i] = -9; dst2[i] = -9; dst3[i] = -9; dst4[i] = -9; dst5[i] = -9; dst6[i] = -9; } shmem_barrier_all(); shmem_short_min_to_all(dst0, src0, N, 0, 0, npes, pWrk0, pSync); shmem_int_min_to_all(dst1, src1, N, 0, 0, npes, pWrk1, pSync1); shmem_long_min_to_all(dst2, src2, N, 0, 0, npes, pWrk2, pSync); shmem_float_min_to_all(dst3, src3, N, 0, 0, npes, pWrk3, pSync1); shmem_double_min_to_all(dst4, src4, N, 0, 0, npes, pWrk4, pSync); shmem_longdouble_min_to_all(dst5, src5, N, 0, 0, npes, pWrk5, pSync1); shmem_longlong_min_to_all(dst6, src6, N, 0, 0, npes, pWrk6, pSync); if(me == 0){ for (i = 0; i < N; i++) { if(dst0[i] != i) success0 =1; if(dst1[i] != i) success1 =1; if(dst2[i] != i) success2 =1; if(dst3[i] != i) success3 =1; if(dst4[i] != i) success4 =1; if(dst5[i] != i) success5 =1; if(dst6[i] != i) success6 =1; } if(success0==1){ printf("Reduction operation shmem_short_min_to_all: Failed\n"); } else{ printf("Reduction operation shmem_short_min_to_all: Passed\n"); } if(success1==1){ printf("Reduction operation shmem_int_min_to_all: Failed\n"); } else{ printf("Reduction operation shmem_int_min_to_all: Passed\n"); } if(success2==1){ printf("Reduction operation shmem_long_min_to_all: Failed\n"); } else{ printf("Reduction operation shmem_long_min_to_all: Passed\n"); } if(success3==1){ printf("Reduction operation shmem_float_min_to_all: Failed\n"); } else{ printf("Reduction operation shmem_float_min_to_all: Passed\n"); } if(success4==1){ printf("Reduction operation shmem_double_min_to_all: Failed\n"); } else{ printf("Reduction operation shmem_double_min_to_all: Passed\n"); } if(success5==1){ printf("Reduction operation shmem_longdouble_min_to_all: Failed\n"); } else{ printf("Reduction operation shmem_longdouble_min_to_all: Passed\n"); } if(success6==1){ printf("Reduction operation shmem_longlong_min_to_all: Failed\n"); } else{ printf("Reduction operation shmem_longlong_min_to_all: Passed\n"); } } /*Test SUM: shmem_double_sum_to_all, shmem_float_sum_to_all, shmem_int_sum_to_all, shmem_long_sum_to_all, shmem_longdouble_sum_to_all, shmem_longlong_sum_to_all, shmem_short_sum_to_all*/ success0 = success1 = success2 = success3 = success4 = success5 = success6 = 0; for (i = 0; i < N; i += 1) { src0[i] = src1[i] = src2[i] = src3[i] = src4[i] = src5[i] = src6[i] = me; } for (i = 0; i < N; i += 1) { dst0[i] = -9; dst1[i] = -9; dst2[i] = -9; dst3[i] = -9; dst4[i] = -9; dst5[i] = -9; dst6[i] = -9; } shmem_barrier_all(); shmem_short_sum_to_all(dst0, src0, N, 0, 0, npes, pWrk0, pSync); shmem_int_sum_to_all(dst1, src1, N, 0, 0, npes, pWrk1, pSync1); shmem_long_sum_to_all(dst2, src2, N, 0, 0, npes, pWrk2, pSync); shmem_float_sum_to_all(dst3, src3, N, 0, 0, npes, pWrk3, pSync1); shmem_double_sum_to_all(dst4, src4, N, 0, 0, npes, pWrk4, pSync); shmem_longdouble_sum_to_all(dst5, src5, N, 0, 0, npes, pWrk5, pSync1); shmem_longlong_sum_to_all(dst6, src6, N, 0, 0, npes, pWrk6, pSync); if(me == 0){ for (i = 0; i < N; i++) { if(dst0[i] != (npes * (npes-1)/2)) success0 =1; if(dst1[i] != (npes * (npes-1)/2)) success1 =1; if(dst2[i] != (npes * (npes-1)/2)) success2 =1; if(dst3[i] != (npes * (npes-1)/2)) success3 =1; if(dst4[i] != (npes * (npes-1)/2)) success4 =1; if(dst5[i] != (npes * (npes-1)/2)) success5 =1; if(dst6[i] != (npes * (npes-1)/2)) success6 =1; } if(success0==1){ printf("Reduction operation shmem_short_sum_to_all: Failed\n"); } else{ printf("Reduction operation shmem_short_sum_to_all: Passed\n"); } if(success1==1){ printf("Reduction operation shmem_int_sum_to_all: Failed\n"); } else{ printf("Reduction operation shmem_int_sum_to_all: Passed\n"); } if(success2==1){ printf("Reduction operation shmem_long_sum_to_all: Failed\n"); } else{ printf("Reduction operation shmem_long_sum_to_all: Passed\n"); } if(success3==1){ printf("Reduction operation shmem_float_sum_to_all: Failed\n"); } else{ printf("Reduction operation shmem_float_sum_to_all: Passed\n"); } if(success4==1){ printf("Reduction operation shmem_double_sum_to_all: Failed\n"); } else{ printf("Reduction operation shmem_double_sum_to_all: Passed\n"); } if(success5==1){ printf("Reduction operation shmem_longdouble_sum_to_all: Failed\n"); } else{ printf("Reduction operation shmem_longdouble_sum_to_all: Passed\n"); } if(success6==1){ printf("Reduction operation shmem_longlong_sum_to_all: Failed\n"); } else{ printf("Reduction operation shmem_longlong_sum_to_all: Passed\n"); } } /*Test AND: shmem_int_and_to_all, shmem_long_and_to_all, shmem_longlong_and_to_all, shmem_short_and_to_all,*/ success0 = success1 = success2 = success6 = 0; for (i = 0; i < N; i += 1) { src0[i] = src1[i] = src2[i] = src6[i] = me; } for (i = 0; i < N; i += 1) { dst0[i] = -9; dst1[i] = -9; dst2[i] = -9; dst6[i] = -9; } shmem_barrier_all(); shmem_short_and_to_all(dst0, src0, N, 0, 0, npes, pWrk0, pSync); shmem_int_and_to_all(dst1, src1, N, 0, 0, npes, pWrk1, pSync1); shmem_long_and_to_all(dst2, src2, N, 0, 0, npes, pWrk2, pSync); shmem_longlong_and_to_all(dst6, src6, N, 0, 0, npes, pWrk6, pSync1); if(me==0){ for (i = 0; i < N; i++) { if(dst0[i] != 0) success0 =1; if(dst1[i] != 0) success1 =1; if(dst2[i] != 0) success2 =1; if(dst6[i] != 0) success6 =1; } if(success0==1){ printf("Reduction operation shmem_short_and_to_all: Failed\n"); } else{ printf("Reduction operation shmem_short_and_to_all: Passed\n"); } if(success1==1){ printf("Reduction operation shmem_int_and_to_all: Failed\n"); } else{ printf("Reduction operation shmem_int_and_to_all: Passed\n"); } if(success2==1){ printf("Reduction operation shmem_long_and_to_all: Failed\n"); } else{ printf("Reduction operation shmem_long_and_to_all: Passed\n"); } if(success6==1){ printf("Reduction operation shmem_longlong_and_to_all: Failed\n"); } else{ printf("Reduction operation shmem_longlong_and_to_all: Passed\n"); } } /*Test PROD: shmem_double_prod_to_all, shmem_float_prod_to_all, shmem_int_prod_to_all, shmem_long_prod_to_all, shmem_longdouble_prod_to_all, shmem_longlong_prod_to_all, shmem_short_prod_to_all, */ success0 = success1 = success2 = success3 = success4 = success5 = success6 = 0; for (i = 0; i < N; i += 1) { src0[i] = src1[i] = src2[i] = src3[i] = src4[i] = src5[i] = src6[i] = me + 1; } for (i = 0; i < N; i += 1) { dst0[i] = -9; dst1[i] = -9; dst2[i] = -9; dst3[i] = -9; dst4[i] = -9; dst5[i] = -9; dst6[i] = -9; } expected_result0 = expected_result1 = expected_result2 = expected_result3 = expected_result4 = expected_result5 = expected_result6 =1; for(i=1;i<=npes;i++){ expected_result0 = expected_result0 * i; expected_result1 = expected_result1 * i; expected_result2 = expected_result2 * i; expected_result3 = expected_result3 * i; expected_result4 = expected_result4 * i; expected_result5 = expected_result5 * i; expected_result6 = expected_result6 * i; } shmem_barrier_all(); shmem_short_prod_to_all(dst0, src0, N, 0, 0, npes, pWrk0, pSync); shmem_int_prod_to_all(dst1, src1, N, 0, 0, npes, pWrk1, pSync1); shmem_long_prod_to_all(dst2, src2, N, 0, 0, npes, pWrk2, pSync); shmem_float_prod_to_all(dst3, src3, N, 0, 0, npes, pWrk3, pSync1); shmem_double_prod_to_all(dst4, src4, N, 0, 0, npes, pWrk4, pSync); shmem_longdouble_prod_to_all(dst5, src5, N, 0, 0, npes, pWrk5, pSync1); shmem_longlong_prod_to_all(dst6, src6, N, 0, 0, npes, pWrk6, pSync); if(me == 0){ for (i = 0; i < N; i++) { /*printf("dst2[%d]: %ld, expected val: %ld\n",i, dst2[i], (long)expected_result2);*/ if(dst0[i] != expected_result0) success0 =1; if(dst1[i] != expected_result1) success1 =1; if(dst2[i] != expected_result2) success2 =1; if(dst3[i] != expected_result3) success3 =1; if(dst4[i] != expected_result4) success4 =1; if(dst5[i] != expected_result5) success5 =1; if(dst6[i] != expected_result6) success6 =1; } if(success0==1){ printf("Reduction operation shmem_short_prod_to_all: Failed\n"); } else{ printf("Reduction operation shmem_short_prod_to_all: Passed\n"); } if(success1==1){ printf("Reduction operation shmem_int_prod_to_all: Failed\n"); } else{ printf("Reduction operation shmem_int_prod_to_all: Passed\n"); } if(success2==1){ printf("Reduction operation shmem_long_prod_to_all: Failed\n"); } else{ printf("Reduction operation shmem_long_prod_to_all: Passed\n"); } if(success3==1){ printf("Reduction operation shmem_float_prod_to_all: Failed\n"); } else{ printf("Reduction operation shmem_float_prod_to_all: Passed\n"); } if(success4==1){ printf("Reduction operation shmem_double_prod_to_all: Failed\n"); } else{ printf("Reduction operation shmem_double_prod_to_all: Passed\n"); } if(success5==1){ printf("Reduction operation shmem_longdouble_prod_to_all: Failed\n"); } else{ printf("Reduction operation shmem_longdouble_prod_to_all: Passed\n"); } if(success6==1){ printf("Reduction operation shmem_longlong_prod_to_all: Failed\n"); } else{ printf("Reduction operation shmem_longlong_prod_to_all: Passed\n"); } } /*Test OR: shmem_int_or_to_all, shmem_long_or_to_all, shmem_longlong_or_to_all, shmem_short_or_to_all,*/ success0 = success1 = success2 = success6 = 0; for (i = 0; i < N; i += 1) { src0[i] = src1[i] = src2[i] = src6[i] = (me + 1)%4; } for (i = 0; i < N; i += 1) { dst0[i] = -9; dst1[i] = -9; dst2[i] = -9; dst6[i] = -9; } shmem_barrier_all(); shmem_short_or_to_all(dst0, src0, N, 0, 0, npes, pWrk0, pSync); shmem_int_or_to_all(dst1, src1, N, 0, 0, npes, pWrk1, pSync1); shmem_long_or_to_all(dst2, src2, N, 0, 0, npes, pWrk2, pSync); shmem_longlong_or_to_all(dst6, src6, N, 0, 0, npes, pWrk6, pSync1); if(me==0){ for (i = 0; i < N; i++) { if(dst0[i] != 3) success0 =1; if(dst1[i] != 3) success1 =1; if(dst2[i] != 3) success2 =1; if(dst6[i] != 3) success6 =1; } if(success0==1){ printf("Reduction operation shmem_short_or_to_all: Failed\n"); } else{ printf("Reduction operation shmem_short_or_to_all: Passed\n"); } if(success1==1){ printf("Reduction operation shmem_int_or_to_all: Failed\n"); } else{ printf("Reduction operation shmem_int_or_to_all: Passed\n"); } if(success2==1){ printf("Reduction operation shmem_long_or_to_all: Failed\n"); } else{ printf("Reduction operation shmem_long_or_to_all: Passed\n"); } if(success6==1){ printf("Reduction operation shmem_longlong_or_to_all: Failed\n"); } else{ printf("Reduction operation shmem_longlong_or_to_all: Passed\n"); } } /*Test XOR: shmem_int_xor_to_all, shmem_long_xor_to_all, shmem_longlong_xor_to_all, shmem_short_xor_to_all*/ success0 = success1 = success2 = success6 = 0; for (i = 0; i < N; i += 1) { src0[i] = src1[i] = src2[i] = src6[i] = me%2; } for (i = 0; i < N; i += 1) { dst0[i] = -9; dst1[i] = -9; dst2[i] = -9; dst6[i] = -9; } int expected_result = ((int)(npes/2) % 2); shmem_barrier_all(); shmem_short_xor_to_all(dst0, src0, N, 0, 0, npes, pWrk0, pSync); shmem_int_xor_to_all(dst1, src1, N, 0, 0, npes, pWrk1, pSync1); shmem_long_xor_to_all(dst2, src2, N, 0, 0, npes, pWrk2, pSync); shmem_longlong_xor_to_all(dst6, src6, N, 0, 0, npes, pWrk6, pSync1); if(me==0){ for (i = 0; i < N; i++) { if(dst0[i] != expected_result) success0 =1; if(dst1[i] != expected_result) success1 =1; if(dst2[i] != expected_result) success2 =1; if(dst6[i] != expected_result) success6 =1; } if(success0==1){ printf("Reduction operation shmem_short_xor_to_all: Failed\n"); } else{ printf("Reduction operation shmem_short_xor_to_all: Passed\n"); } if(success1==1){ printf("Reduction operation shmem_int_xor_to_all: Failed\n"); } else{ printf("Reduction operation shmem_int_xor_to_all: Passed\n"); } if(success2==1){ printf("Reduction operation shmem_long_xor_to_all: Failed\n"); } else{ printf("Reduction operation shmem_long_xor_to_all: Passed\n"); } if(success6==1){ printf("Reduction operation shmem_longlong_xor_to_all: Failed\n"); } else{ printf("Reduction operation shmem_longlong_xor_to_all: Passed\n"); } } return 0; }
int min_to_all(int me, int npes) { int i, pass=0; memset(ok,0,sizeof(ok)); for (i = 0; i < N; i++) { src0[i] = src1[i] = src2[i] = src3[i] = src4[i] = src5[i] = src6[i] = me + i; dst0[i] = -9; dst1[i] = -9; dst2[i] = -9; dst3[i] = -9; dst4[i] = -9; dst5[i] = -9; dst6[i] = -9; } shmem_barrier_all(); shmem_short_min_to_all(dst0, src0, N, 0, 0, npes, pWrk0, pSync); shmem_int_min_to_all(dst1, src1, N, 0, 0, npes, pWrk1, pSync1); shmem_long_min_to_all(dst2, src2, N, 0, 0, npes, pWrk2, pSync); shmem_float_min_to_all(dst3, src3, N, 0, 0, npes, pWrk3, pSync1); shmem_double_min_to_all(dst4, src4, N, 0, 0, npes, pWrk4, pSync); shmem_longdouble_min_to_all(dst5, src5, N, 0, 0, npes, pWrk5, pSync1); shmem_longlong_min_to_all(dst6, src6, N, 0, 0, npes, pWrk6, pSync); if(me == 0) { for (i = 0; i < N; i++) { if(dst0[i] != i) ok[0] = 1; if(dst1[i] != i) ok[1] = 1; if(dst2[i] != i) ok[2] = 1; if(dst3[i] != i) ok[3] = 1; if(dst4[i] != i) ok[4] = 1; if(dst5[i] != i) ok[5] = 1; if(dst6[i] != i) ok[6] = 1; } if(ok[0]==1){ printf("Reduction operation shmem_short_min_to_all: Failed\n"); } else{ Vprintf("Reduction operation shmem_short_min_to_all: Passed\n"); pass++; } if(ok[1]==1){ printf("Reduction operation shmem_int_min_to_all: Failed\n"); } else{ Vprintf("Reduction operation shmem_int_min_to_all: Passed\n"); pass++; } if(ok[2]==1){ printf("Reduction operation shmem_long_min_to_all: Failed\n"); } else{ Vprintf("Reduction operation shmem_long_min_to_all: Passed\n"); pass++; } if(ok[3]==1){ printf("Reduction operation shmem_float_min_to_all: Failed\n"); } else{ Vprintf("Reduction operation shmem_float_min_to_all: Passed\n"); pass++; } if(ok[4]==1){ printf("Reduction operation shmem_double_min_to_all: Failed\n"); } else{ Vprintf("Reduction operation shmem_double_min_to_all: Passed\n"); pass++; } if(ok[5]==1){ printf("Reduction operation shmem_longdouble_min_to_all: Failed\n"); } else{ Vprintf("Reduction operation shmem_longdouble_min_to_all: Passed\n"); pass++; } if(ok[6]==1){ printf("Reduction operation shmem_longlong_min_to_all: Failed\n"); } else{ Vprintf("Reduction operation shmem_longlong_min_to_all: Passed\n"); pass++; } Vprintf("\n"); } if (Serialize) shmem_barrier_all(); return (pass == 7 ? 1 : 0); }
int main(int argc, char *argv[]) { int i = 0, rank, size; int skip, numprocs; static double avg_time = 0.0, max_time = 0.0, min_time = 0.0; static double latency = 0.0; int64_t t_start = 0, t_stop = 0, timer=0; char *buffer=NULL; int max_msg_size = 1048576, full = 0; int t; for ( t = 0; t < _SHMEM_BCAST_SYNC_SIZE; t += 1) pSyncBcast1[t] = _SHMEM_SYNC_VALUE; for ( t = 0; t < _SHMEM_BCAST_SYNC_SIZE; t += 1) pSyncBcast2[t] = _SHMEM_SYNC_VALUE; for ( t = 0; t < _SHMEM_REDUCE_SYNC_SIZE; t += 1) pSyncRed1[t] = _SHMEM_SYNC_VALUE; for ( t = 0; t < _SHMEM_REDUCE_SYNC_SIZE; t += 1) pSyncRed2[t] = _SHMEM_SYNC_VALUE; start_pes(0); rank = _my_pe(); numprocs = _num_pes(); if (process_args(argc, argv, rank, &max_msg_size, &full)) { return 0; } if(numprocs < 2) { if(rank == 0) { fprintf(stderr, "This test requires at least two processes\n"); } return -1; } print_header(rank, full); buffer = shmalloc(max_msg_size * sizeof(char)); if(NULL == buffer) { fprintf(stderr, "malloc failed.\n"); exit(1); } memset(buffer,1, max_msg_size); for(size=1; size <=max_msg_size/sizeof(uint32_t); size *= 2) { if(size > LARGE_MESSAGE_SIZE) { skip = SKIP_LARGE; iterations = iterations_large; } else { skip = SKIP; } timer=0; for(i=0; i < iterations + skip ; i++) { t_start = TIME(); if(i%2) shmem_broadcast32(buffer, buffer, size, 0, 0, 0, numprocs, pSyncBcast1); else shmem_broadcast32(buffer, buffer, size, 0, 0, 0, numprocs, pSyncBcast2); t_stop = TIME(); if(i>=skip){ timer+=t_stop-t_start; } shmem_barrier_all(); } shmem_barrier_all(); latency = (1.0 * timer) / iterations; shmem_double_min_to_all(&min_time, &latency, 1, 0, 0, numprocs, pWrk1, pSyncRed1); shmem_double_max_to_all(&max_time, &latency, 1, 0, 0, numprocs, pWrk2, pSyncRed2); shmem_double_sum_to_all(&avg_time, &latency, 1, 0, 0, numprocs, pWrk1, pSyncRed1); avg_time = avg_time/numprocs; print_data(rank, full, size*sizeof(uint32_t), avg_time, min_time, max_time, iterations); } shfree(buffer); return EXIT_SUCCESS; }