/**************************************************************************** * Place for Test Item functions ***************************************************************************/ static int test_item1(void) { int rc = TC_PASS; TYPE_VALUE* shmem_addr = NULL; TYPE_VALUE my_value = 0; TYPE_VALUE expect_value = 0; int num_proc = 0; int my_proc = 0; int peer_proc = 0; int i = 0; num_proc = _num_pes(); my_proc = _my_pe(); shmem_addr = shmalloc(sizeof(*shmem_addr)); if (shmem_addr) { TYPE_VALUE value = 0; /* Store my value */ my_value = (TYPE_VALUE)my_proc; *shmem_addr = DEFAULT_VALUE; /* Define peer */ peer_proc = (my_proc + 1) % num_proc; /* Define expected value */ expect_value = (TYPE_VALUE)(( my_proc == 0 ? (num_proc - 1) : (my_proc - 1) ) + (__cycle_count - 1)); shmem_barrier_all(); for (i = 0; (i < __cycle_count) && (rc == TC_PASS); i++) { value = FUNC_VALUE(shmem_addr, (my_value + i), peer_proc); if ( ((i >0 ) && (!sys_fcompare(value, my_value + i - 1))) || ((i == 0) && (!sys_fcompare(value, DEFAULT_VALUE))) ) { break; } } shmem_barrier_all(); value = *shmem_addr; rc = (sys_fcompare(expect_value, value) ? TC_PASS : TC_FAIL); log_debug(OSH_TC, "my(#%d:%Lf) expected = %Lf vs got = %Lf\n", my_proc, (long double)my_value, (long double)expect_value, (long double)value); } else { rc = TC_SETUP_FAIL; } if (shmem_addr) { shfree(shmem_addr); } return rc; }
static int test_item2(void) { int rc = TC_PASS; TYPE_VALUE* shmem_addr = NULL; TYPE_VALUE my_value = 0; TYPE_VALUE peer_value = 0; TYPE_VALUE expect_value = 0; int num_proc = 0; int my_proc = 0; int peer_proc = 0; num_proc = _num_pes(); my_proc = _my_pe(); shmem_addr = shmalloc(sizeof(*shmem_addr)); if (shmem_addr) { TYPE_VALUE value = -1; /* Set my value */ my_value = (-1); *shmem_addr = my_value; /* Define peer and it value */ peer_proc = (my_proc + 1) % num_proc; peer_value = (TYPE_VALUE)my_proc; /* Define expected value */ expect_value = (TYPE_VALUE)(my_proc ? (my_proc - 1) : (num_proc - 1)); /* This guarantees that PE set initial value before peer change one */ shmem_barrier_all(); /* Write value to peer */ FUNC_VALUE(shmem_addr, peer_value, peer_proc); /* Get value put by peer: * These routines start the remote transfer and may return before the data * is delivered to the remote PE */ wait_for_put_completion(peer_proc,10 /* wait for 10 secs */); value = *shmem_addr; rc = (sys_fcompare(expect_value, value) ? TC_PASS : TC_FAIL); log_debug(OSH_TC, "my(#%d:%Lf) peer(#%d:%Lf) expected = %Lf vs got = %Lf\n", my_proc, (long double)my_value, peer_proc, (long double)peer_value, (long double)expect_value, (long double)value); } else { rc = TC_SETUP_FAIL; } if (shmem_addr) { shfree(shmem_addr); } return rc; }
/**************************************************************************** * Place for Test Item functions ***************************************************************************/ static int test_item1(void) { int rc = TC_PASS; TYPE_VALUE* shmem_addr = NULL; TYPE_VALUE my_value = 0; TYPE_VALUE peer_value = 0; TYPE_VALUE expect_value = 0; int my_proc = 0; int peer_proc = 0; my_proc = _my_pe(); shmem_addr = shmalloc(sizeof(*shmem_addr)); if (shmem_addr) { /* Set my value */ my_value = (-1); *shmem_addr = my_value; /* Define peer and it value */ peer_proc = my_proc; peer_value = (TYPE_VALUE)(((double)rand() / (double)RAND_MAX) * MAX_VALUE); /* Define expected value */ expect_value = peer_value; /* This guarantees that PE set initial value before peer change one */ shmem_barrier_all(); /* Get value from peer */ FUNC_VALUE(shmem_addr, &peer_value, 1, peer_proc); /* Get value put by peer: * These routines start the remote transfer and may return before the data * is delivered to the remote PE */ wait_for_put_completion(peer_proc,10 /* wait for 10 secs */); rc = (sys_fcompare(expect_value, *shmem_addr) ? TC_PASS : TC_FAIL); log_debug(OSH_TC, "my(#%d:%Lf) peer(#%d:%Lf) expected = %Lf buffer size = %lld\n", my_proc, (long double)my_value, peer_proc, (long double)peer_value, (long double)expect_value, (INT64_TYPE)1); } else { rc = TC_SETUP_FAIL; } if (shmem_addr) { shfree(shmem_addr); } return rc; }
static int test_item2(void) { int rc = TC_PASS; TYPE_VALUE* shmem_addr = NULL; TYPE_VALUE my_value = 0; TYPE_VALUE peer_value = 0; TYPE_VALUE expect_value = 0; int num_proc = 0; int my_proc = 0; int peer_proc = 0; num_proc = _num_pes(); my_proc = _my_pe(); shmem_addr = shmalloc(sizeof(*shmem_addr)); if (shmem_addr) { TYPE_VALUE value = -1; /* Set my value */ my_value = (TYPE_VALUE)my_proc; *shmem_addr = my_value; /* Define peer and it value */ peer_proc = (my_proc + 1) % num_proc; peer_value = (TYPE_VALUE)peer_proc; /* Define expected value */ expect_value = peer_value; /* Wait is set instead of barrier to give some time to all PE for setting their values */ shmem_barrier_all(); /* Get value from peer */ FUNC_VALUE(&value, shmem_addr, 1, peer_proc); rc = (sys_fcompare(expect_value, value) ? TC_PASS : TC_FAIL); log_debug(OSH_TC, "my(#%d:%Lf) peer(#%d:%Lf) expected = %Lf buffer size = %lld\n", my_proc, (long double)my_value, peer_proc, (long double)peer_value, (long double)expect_value, (INT64_TYPE)1); } else { rc = TC_SETUP_FAIL; } if (shmem_addr) { shfree(shmem_addr); } return rc; }
static int test_item7(void) { int rc = TC_PASS; TYPE_VALUE* target_addr = NULL; TYPE_VALUE* source_addr = NULL; TYPE_VALUE source_value = 0; TYPE_VALUE expect_value = 0; int num_proc = 0; int my_proc = 0; num_proc = _num_pes(); my_proc = _my_pe(); target_addr = (TYPE_VALUE*)shmalloc(sizeof(*target_addr) * __max_buffer_size); source_addr = (TYPE_VALUE*)shmalloc(sizeof(*source_addr) * __max_buffer_size); if (target_addr && source_addr) { TYPE_VALUE value = DEFAULT_VALUE; int i = 0; int j = 0; long cur_buf_size = 0; for (i = 0; (i < __cycle_count) && (rc == TC_PASS); i++) { cur_buf_size = sys_max(1, (i + 1) * __max_buffer_size / __cycle_count); pWrk = shmalloc(sizeof(*pWrk) * sys_max(cur_buf_size/2 + 1, _SHMEM_REDUCE_MIN_WRKDATA_SIZE)); if (pWrk) { /* Set initial target value */ value = DEFAULT_VALUE; fill_buffer((void *)target_addr, cur_buf_size, (void *)&value, sizeof(value)); /* Give some time to all PE for setting their values */ shmem_barrier_all(); /* Set my value */ source_value = ( my_proc < OVERFLOW_FACTORIAL_LIMIT ? (TYPE_VALUE)(my_proc + 1) : 1); fill_buffer((void *)source_addr, cur_buf_size, (void *)&source_value, sizeof(source_value)); /* Define expected value */ expect_value = 1; if (my_proc % 2) expect_value = DEFAULT_VALUE; else { int k = ( num_proc <= OVERFLOW_FACTORIAL_LIMIT ? num_proc : OVERFLOW_FACTORIAL_LIMIT); while (k) { if (k % 2) expect_value *= k; k--; } } /* This guarantees that PE set initial value before peer change one */ for ( j = 0; j < _SHMEM_REDUCE_SYNC_SIZE; j++ ) { pSync[j] = _SHMEM_SYNC_VALUE; } shmem_barrier_all(); /* Put value to peer */ FUNC_VALUE(target_addr, source_addr, cur_buf_size, 0, 1, ((num_proc / 2) + (num_proc % 2)), pWrk, pSync); /* Get value put by peer: * These routines start the remote transfer and may return before the data * is delivered to the remote PE */ shmem_barrier_all(); { int wait = WAIT_COUNT; while (wait--) { value = *target_addr; if (sys_fcompare(expect_value, value)) break; sleep(1); } } rc = (!compare_buffer_with_const_longdouble(target_addr, cur_buf_size, expect_value) ? TC_PASS : TC_FAIL); log_debug(OSH_TC, "my#%d source = %Lf expected = %Lf actual = %Lf buffer size = %lld\n", my_proc, (long double)source_value, (long double)expect_value, (long double)value, (INT64_TYPE)cur_buf_size); if (rc) { TYPE_VALUE* check_addr = target_addr; int odd_index = compare_buffer_with_const_longdouble(check_addr, cur_buf_size, expect_value); int show_index = (odd_index > 1 ? odd_index - 2 : 0); int show_size = sizeof(*check_addr) * sys_min(3, cur_buf_size - odd_index - 1); log_debug(OSH_TC, "index of incorrect value: 0x%08X (%d)\n", odd_index - 1, odd_index - 1); log_debug(OSH_TC, "buffer interval: 0x%08X - 0x%08X\n", show_index, show_index + show_size); show_buffer(check_addr + show_index, show_size); } shfree(pWrk); } else { rc = TC_SETUP_FAIL; } } } else { rc = TC_SETUP_FAIL; } if (source_addr) { shfree(source_addr); } if (target_addr) { shfree(target_addr); } return rc; }
static int test_item4(void) { int rc = TC_PASS; TYPE_VALUE* target_addr = NULL; TYPE_VALUE* source_addr = NULL; TYPE_VALUE source_value = 0; TYPE_VALUE expect_value = 0; int num_proc = 0; int my_proc = 0; num_proc = _num_pes(); my_proc = _my_pe(); pWrk = shmalloc(sizeof(*pWrk) * sys_max(1/2 + 1, _SHMEM_REDUCE_MIN_WRKDATA_SIZE)); if (pWrk) { source_addr = shmalloc(sizeof(*source_addr)); target_addr = source_addr; } if (target_addr && source_addr) { TYPE_VALUE value = DEFAULT_VALUE; int j = 0; /* Set my value */ source_value = ( my_proc < OVERFLOW_FACTORIAL_LIMIT ? (TYPE_VALUE)(my_proc + 1) : 1); *source_addr = source_value; /* Define expected value */ expect_value = 1; { int k = ( num_proc <= OVERFLOW_FACTORIAL_LIMIT ? num_proc : OVERFLOW_FACTORIAL_LIMIT); while (k) expect_value *= k--; } /* This guarantees that PE set initial value before peer change one */ for ( j = 0; j < _SHMEM_REDUCE_SYNC_SIZE; j++ ) { pSync[j] = _SHMEM_SYNC_VALUE; } shmem_barrier_all(); /* Put value to peer */ FUNC_VALUE(target_addr, source_addr, 1, 0, 0, num_proc, pWrk, pSync); /* Get value put by peer: * These routines start the remote transfer and may return before the data * is delivered to the remote PE */ shmem_barrier_all(); { int total_wait = 0; while (sys_fcompare(*target_addr, DEFAULT_VALUE) && total_wait < 1000 * WAIT_COUNT) { total_wait++; usleep(1); } value = *target_addr; } rc = (sys_fcompare(expect_value, value) ? TC_PASS : TC_FAIL); log_debug(OSH_TC, "my#%d source = %Lf expected = %Lf actual = %Lf\n", my_proc, (long double)source_value, (long double)expect_value, (long double)value); } else { rc = TC_SETUP_FAIL; } if (source_addr) { shfree(source_addr); } if (pWrk) { shfree(pWrk); pWrk = NULL; } return rc; }
static int test_item3(void) { int rc = TC_PASS; TYPE_VALUE* shmem_addr = NULL; TYPE_VALUE my_value = 0; TYPE_VALUE* check_arr = NULL; int num_proc = 0; int my_proc = 0; int peer_proc = 0; int i = 0; int j = 0; int k = 0; int flag = 0; int missed_values = 0; static long* pSync = NULL; num_proc = _num_pes(); my_proc = _my_pe(); shmem_addr = shmalloc(sizeof(*shmem_addr)); check_arr = shmalloc(sizeof(*check_arr) * num_proc); pSync = shmalloc(sizeof(*pSync) * _SHMEM_COLLECT_SYNC_SIZE); for (i = 0; i < _SHMEM_COLLECT_SYNC_SIZE; i++) { pSync[i] = _SHMEM_SYNC_VALUE; } if (shmem_addr && pSync && check_arr) { static TYPE_VALUE value = 0; /* Store my value */ my_value = (TYPE_VALUE)my_proc; *shmem_addr = DEFAULT_VALUE; shmem_barrier_all(); for (i = 0; (i < __cycle_count) && (rc == TC_PASS); i++) { missed_values = 0; my_value = (TYPE_VALUE)my_proc; value = FUNC_VALUE(shmem_addr, my_value, peer_proc); shmem_barrier_all(); shmem_collect32(check_arr, &value, (sizeof(value) + 3 ) / 4, 0, 0, num_proc, pSync); shmem_barrier_all(); for (j = 0; j < num_proc ; j++) { flag = 0; for (k = 0; k < num_proc; k++) { if (sys_fcompare(check_arr[k], j)) { flag = 1; break; } } if (flag == 0) { missed_values++; } if (missed_values > 1) { rc = TC_FAIL; break; } } } shmem_barrier_all(); log_debug(OSH_TC, "my(#%d:%lld) missed_values expected = 1 vs missed_values = %d\n", my_proc, (INT64_TYPE)my_value, missed_values); } else { rc = TC_SETUP_FAIL; } if (shmem_addr) { shfree(shmem_addr); } if (pSync) { shfree(pSync); } return rc; }
/**************************************************************************** * Place for Test Item functions ***************************************************************************/ static int test_item1(void) { int rc = TC_PASS; TYPE_VALUE* target_addr = NULL; TYPE_VALUE* source_addr = NULL; TYPE_VALUE source_value = 0; TYPE_VALUE expect_value = 0; int my_proc = 0; my_proc = _my_pe(); pWrk = shmalloc(sizeof(*pWrk) * sys_max(1/2 + 1, _SHMEM_REDUCE_MIN_WRKDATA_SIZE)); if (pWrk) { target_addr = shmalloc(sizeof(*target_addr)); source_addr = shmalloc(sizeof(*source_addr)); } if (target_addr && source_addr) { TYPE_VALUE value = DEFAULT_VALUE; int j = 0; /* Set initial target value */ *target_addr = DEFAULT_VALUE; /* Set my value */ source_value = (TYPE_VALUE)(BASE_VALUE + my_proc); *source_addr = source_value; /* Define expected value */ expect_value = source_value; /* This guarantees that PE set initial value before peer change one */ for ( j = 0; j < _SHMEM_REDUCE_SYNC_SIZE; j++ ) { pSync[j] = _SHMEM_SYNC_VALUE; } shmem_barrier_all(); /* Put value to peer */ FUNC_VALUE(target_addr, source_addr, 1, my_proc, 0, 1, pWrk, pSync); /* Get value put by peer: * These routines start the remote transfer and may return before the data * is delivered to the remote PE */ shmem_barrier_all(); { int total_wait = 0; while (sys_fcompare(*target_addr, DEFAULT_VALUE) && total_wait < 1000 * WAIT_COUNT) { total_wait++; usleep(1); } value = *target_addr; } rc = (sys_fcompare(expect_value, value) ? TC_PASS : TC_FAIL); log_debug(OSH_TC, "my#%d source = %lld expected = %lld actual = %lld\n", my_proc, (INT64_TYPE)source_value, (INT64_TYPE)expect_value, (INT64_TYPE)value); } else { rc = TC_SETUP_FAIL; } if (source_addr) { shfree(source_addr); } if (target_addr) { shfree(target_addr); } if (pWrk) { shfree(pWrk); pWrk = NULL; } return rc; }