static void ucx_perf_test_reset(ucx_perf_context_t *perf, ucx_perf_params_t *params) { unsigned i; perf->params = *params; perf->start_time = ucs_get_time(); perf->prev_time = perf->start_time; perf->end_time = (perf->params.max_time == 0.0) ? UINT64_MAX : ucs_time_from_sec(perf->params.max_time) + perf->start_time; perf->max_iter = (perf->params.max_iter == 0) ? UINT64_MAX : perf->params.max_iter; perf->report_interval = ucs_time_from_sec(perf->params.report_interval); perf->current.time = 0; perf->current.msgs = 0; perf->current.bytes = 0; perf->current.iters = 0; perf->prev.time = perf->start_time; perf->prev.msgs = 0; perf->prev.bytes = 0; perf->prev.iters = 0; perf->timing_queue_head = 0; perf->offset = 0; for (i = 0; i < TIMING_QUEUE_SIZE; ++i) { perf->timing_queue[i] = 0; } }
static double measure_memcpy_bandwidth(size_t size) { ucs_time_t start_time, end_time; void *src, *dst; double result = 0.0; int iter; src = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); if (src == MAP_FAILED) { goto out; } dst = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); if (dst == MAP_FAILED) { goto out_unmap_src; } memset(dst, 0, size); memset(src, 0, size); memcpy(dst, src, size); iter = 0; start_time = ucs_get_time(); do { memcpy(dst, src, size); end_time = ucs_get_time(); ++iter; } while (end_time < start_time + ucs_time_from_sec(0.5)); result = size * iter / ucs_time_to_sec(end_time - start_time); munmap(dst, size); out_unmap_src: munmap(src, size); out: return result; }
void ucx_perf_calc_result(ucx_perf_context_t *perf, ucx_perf_result_t *result) { double factor; double sec_value; sec_value = ucs_time_from_sec(1.0); if (perf->params.test_type == UCX_PERF_TEST_TYPE_PINGPONG) { factor = 2.0; } else { factor = 1.0; } result->iters = perf->current.iters; result->bytes = perf->current.bytes; result->elapsed_time = perf->current.time - perf->start_time; /* Latency */ result->latency.typical = __find_median_quick_select(perf->timing_queue, TIMING_QUEUE_SIZE) / sec_value / factor; result->latency.moment_average = (double)(perf->current.time - perf->prev.time) / (perf->current.iters - perf->prev.iters) / sec_value / factor; result->latency.total_average = (double)(perf->current.time - perf->start_time) / perf->current.iters / sec_value / factor; /* Bandwidth */ result->bandwidth.typical = 0.0; // Undefined result->bandwidth.moment_average = (perf->current.bytes - perf->prev.bytes) * sec_value / (double)(perf->current.time - perf->prev.time) * factor; result->bandwidth.total_average = perf->current.bytes * sec_value / (double)(perf->current.time - perf->start_time) * factor; /* Packet rate */ result->msgrate.typical = 0.0; // Undefined result->msgrate.moment_average = (perf->current.msgs - perf->prev.msgs) * sec_value / (double)(perf->current.time - perf->prev.time) * factor; result->msgrate.total_average = perf->current.msgs * sec_value / (double)(perf->current.time - perf->start_time) * factor; }