2 * Copyright (C) by Argonne National Laboratory
3 * See COPYRIGHT in top-level directory
13 #define MAX_DATA_SIZE (1024)
14 #define MAX_NUM_ITERATIONS (1024)
15 #define MIN_NUM_ITERATIONS 8
16 #define NUM_WARMUP_ITER 1
18 const int verbose = 0;
21 static void run_test(int lock_mode, int lock_assert)
23 int nproc, test_iter, target_rank, data_size;
27 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
28 MPI_Comm_size(MPI_COMM_WORLD, &nproc);
30 if (rank == 0 && verbose) {
31 printf("Starting one-sided contiguous performance test with %d processes\n", nproc);
33 printf("Synchronization mode: ");
36 case MPI_LOCK_EXCLUSIVE:
37 printf("Exclusive lock");
40 printf("Shared lock");
43 printf("Unknown lock");
47 if (lock_assert & MPI_MODE_NOCHECK)
48 printf(", MPI_MODE_NOCHECK");
53 MPI_Alloc_mem(MAX_DATA_SIZE, MPI_INFO_NULL, &buf);
54 MPI_Alloc_mem(MAX_DATA_SIZE, MPI_INFO_NULL, &win_buf);
55 memset(buf, rank, MAX_DATA_SIZE);
56 memset(win_buf, rank, MAX_DATA_SIZE);
57 MPI_Win_create(win_buf, MAX_DATA_SIZE, 1, MPI_INFO_NULL, MPI_COMM_WORLD, &win);
59 if (rank == 0 && verbose)
60 printf("%12s %12s %12s %12s %12s %12s %12s %12s\n", "Trg. Rank", "Xfer Size",
61 "Get (usec)", "Put (usec)", "Acc (usec)",
62 "Get (MiB/s)", "Put (MiB/s)", "Acc (MiB/s)");
64 for (target_rank = 0; rank == 0 && target_rank < nproc; target_rank++) {
65 for (data_size = sizeof(double); data_size <= MAX_DATA_SIZE; data_size *= 2) {
66 double t_get, t_put, t_acc;
67 int num_iter = MAX_NUM_ITERATIONS;
69 /* Scale the number of iterations by log_2 of the data size, so
70 * that we run each test for a reasonable amount of time. */
72 int t = data_size, my_log2 = 0;
76 num_iter = (num_iter / my_log2 < MIN_NUM_ITERATIONS) ?
77 MIN_NUM_ITERATIONS : num_iter / my_log2;
80 for (test_iter = 0; test_iter < num_iter + NUM_WARMUP_ITER; test_iter++) {
81 if (test_iter == NUM_WARMUP_ITER)
84 MPI_Win_lock(lock_mode, target_rank, lock_assert, win);
85 MPI_Get(buf, data_size, MPI_BYTE, target_rank, 0, data_size, MPI_BYTE, win);
86 MPI_Win_unlock(target_rank, win);
88 t_get = (MPI_Wtime() - t_get) / num_iter;
90 for (test_iter = 0; test_iter < num_iter + NUM_WARMUP_ITER; test_iter++) {
91 if (test_iter == NUM_WARMUP_ITER)
94 MPI_Win_lock(lock_mode, target_rank, lock_assert, win);
95 MPI_Put(buf, data_size, MPI_BYTE, target_rank, 0, data_size, MPI_BYTE, win);
96 MPI_Win_unlock(target_rank, win);
98 t_put = (MPI_Wtime() - t_put) / num_iter;
100 for (test_iter = 0; test_iter < num_iter + NUM_WARMUP_ITER; test_iter++) {
101 if (test_iter == NUM_WARMUP_ITER)
104 MPI_Win_lock(lock_mode, target_rank, lock_assert, win);
105 MPI_Accumulate(buf, data_size / sizeof(int), MPI_INT, target_rank,
106 0, data_size / sizeof(int), MPI_INT, MPI_BXOR, win);
107 MPI_Win_unlock(target_rank, win);
109 t_acc = (MPI_Wtime() - t_acc) / num_iter;
111 if (rank == 0 && verbose)
112 printf("%12d %12d %12.3f %12.3f %12.3f %12.3f %12.3f %12.3f\n", target_rank,
113 data_size, t_get * 1.0e6, t_put * 1.0e6, t_acc * 1.0e6,
114 data_size / (1024.0 * 1024.0) / t_get, data_size / (1024.0 * 1024.0) / t_put,
115 data_size / (1024.0 * 1024.0) / t_acc);
119 MPI_Barrier(MPI_COMM_WORLD);
122 MPI_Free_mem(win_buf);
126 int main(int argc, char **argv)
128 MTest_Init(&argc, &argv);
130 run_test(MPI_LOCK_EXCLUSIVE, 0);
131 run_test(MPI_LOCK_EXCLUSIVE, MPI_MODE_NOCHECK);
132 run_test(MPI_LOCK_SHARED, 0);
133 run_test(MPI_LOCK_SHARED, MPI_MODE_NOCHECK);