TEST_F(MPIProfileTest, progress) { struct geopm_prof_c *prof; uint64_t region_id[3]; struct geopm_time_s start, curr; double timeout = 0.0; int rank; int num_node = 0; (void) geopm_comm_num_node(MPI_COMM_WORLD, &num_node); ASSERT_TRUE(num_node > 1); MPI_Comm_rank(MPI_COMM_WORLD, &rank); ASSERT_EQ(0, geopm_prof_create("progress_test", m_shm_key, MPI_COMM_WORLD, &prof)); ASSERT_EQ(0, geopm_prof_region(prof, "loop_one", GEOPM_POLICY_HINT_UNKNOWN, ®ion_id[0])); ASSERT_EQ(0, geopm_prof_enter(prof, region_id[0])); ASSERT_EQ(0, geopm_time(&start)); while (timeout < 1.0) { ASSERT_EQ(0, geopm_time(&curr)); timeout = geopm_time_diff(&start, &curr); geopm_prof_progress(prof, region_id[0], timeout/1.0); } ASSERT_EQ(0, geopm_prof_exit(prof, region_id[0])); timeout = 0.0; ASSERT_EQ(0, geopm_prof_region(prof, "loop_two", GEOPM_POLICY_HINT_UNKNOWN, ®ion_id[1])); ASSERT_EQ(0, geopm_prof_enter(prof, region_id[1])); ASSERT_EQ(0, geopm_time(&start)); while (timeout < 2.0) { ASSERT_EQ(0, geopm_time(&curr)); timeout = geopm_time_diff(&start, &curr); geopm_prof_progress(prof, region_id[1], timeout/2.0); } ASSERT_EQ(0, geopm_prof_exit(prof, region_id[1])); timeout = 0.0; ASSERT_EQ(0, geopm_prof_region(prof, "loop_three", GEOPM_POLICY_HINT_UNKNOWN, ®ion_id[2])); ASSERT_EQ(0, geopm_prof_enter(prof, region_id[2])); ASSERT_EQ(0, geopm_time(&start)); while (timeout < 3.0) { ASSERT_EQ(0, geopm_time(&curr)); timeout = geopm_time_diff(&start, &curr); geopm_prof_progress(prof, region_id[2], timeout/3.0); } ASSERT_EQ(0, geopm_prof_exit(prof, region_id[2])); ASSERT_EQ(0, geopm_prof_print(prof, m_log_file.c_str(), 0)); if (m_is_node_root) { ASSERT_EQ(0, parse_log(false)); } ASSERT_EQ(0, geopm_prof_destroy(prof)); }
int main(int argc, char**argv) { uint64_t region_id[3]; struct geopm_time_s start, curr; double timeout = 0; int rank; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); geopm_prof_region("loop_one", GEOPM_REGION_HINT_UNKNOWN, ®ion_id[0]); geopm_prof_enter(region_id[0]); geopm_time(&start); while (timeout < 1.0) { geopm_time(&curr); timeout = geopm_time_diff(&start, &curr); geopm_prof_progress(region_id[2], timeout/1.0); } geopm_prof_exit(region_id[0]); geopm_prof_region("loop_two", GEOPM_REGION_HINT_UNKNOWN, ®ion_id[1]); geopm_prof_enter(region_id[1]); geopm_time(&start); while (timeout < 2.0) { geopm_time(&curr); timeout = geopm_time_diff(&start, &curr); geopm_prof_progress(region_id[2], timeout/2.0); } geopm_prof_exit(region_id[1]); geopm_prof_region("loop_three", GEOPM_REGION_HINT_UNKNOWN, ®ion_id[2]); geopm_prof_enter(region_id[2]); geopm_time(&start); while (timeout < 3.0) { geopm_time(&curr); timeout = geopm_time_diff(&start, &curr); geopm_prof_progress(region_id[2], timeout/3.0); } geopm_prof_exit(region_id[2]); MPI_Finalize(); return 0; }
static int stream_profiled_serial(uint64_t region_id, size_t num_stream, double scalar, double *a, double *b, double *c) { const size_t block = 256; const size_t num_block = num_stream / block; const size_t num_remain = num_stream % block; const double norm = 1.0 / num_block; for (size_t i = 0; i < num_block; ++i) { for (size_t j = 0; j < block; ++j) { a[i * block + j] = b[i * block + j] + scalar * c[i * block + j]; } geopm_prof_progress(region_id, i * norm); } for (size_t j = 0; j < num_remain; ++j) { a[num_block * block + j] = b[num_block * block + j] + scalar * c[num_block * block + j]; } return 0; }