Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add new entry in Release_Notes.
[simgrid.git] / teshsuite / smpi / mpich3-test / rma / rma-contig.c
1 /*
2  * Copyright (C) by Argonne National Laboratory
3  *     See COPYRIGHT in top-level directory
4  */
5
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <assert.h>
9 #include <string.h>
10 #include <mpi.h>
11 #include "mpitest.h"
12
13 #define MAX_DATA_SIZE   (1024)
14 #define MAX_NUM_ITERATIONS (1024)
15 #define MIN_NUM_ITERATIONS 8
16 #define NUM_WARMUP_ITER 1
17
18 const int verbose = 0;
19 static int rank;
20
21 static void run_test(int lock_mode, int lock_assert)
22 {
23     int nproc, test_iter, target_rank, data_size;
24     int *buf, *win_buf;
25     MPI_Win win;
26
27     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
28     MPI_Comm_size(MPI_COMM_WORLD, &nproc);
29
30     if (rank == 0 && verbose) {
31         printf("Starting one-sided contiguous performance test with %d processes\n", nproc);
32
33         printf("Synchronization mode: ");
34
35         switch (lock_mode) {
36             case MPI_LOCK_EXCLUSIVE:
37                 printf("Exclusive lock");
38                 break;
39             case MPI_LOCK_SHARED:
40                 printf("Shared lock");
41                 break;
42             default:
43                 printf("Unknown lock");
44                 break;
45         }
46
47         if (lock_assert & MPI_MODE_NOCHECK)
48             printf(", MPI_MODE_NOCHECK");
49
50         printf("\n");
51     }
52
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);
58
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)");
63
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;
68
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. */
71             {
72                 int t = data_size, my_log2 = 0;
73                 while (t >>= 1)
74                     my_log2++;
75                 if (my_log2)
76                     num_iter = (num_iter / my_log2 < MIN_NUM_ITERATIONS) ?
77                         MIN_NUM_ITERATIONS : num_iter / my_log2;
78             }
79
80             for (test_iter = 0; test_iter < num_iter + NUM_WARMUP_ITER; test_iter++) {
81                 if (test_iter == NUM_WARMUP_ITER)
82                     t_get = MPI_Wtime();
83
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);
87             }
88             t_get = (MPI_Wtime() - t_get) / num_iter;
89
90             for (test_iter = 0; test_iter < num_iter + NUM_WARMUP_ITER; test_iter++) {
91                 if (test_iter == NUM_WARMUP_ITER)
92                     t_put = MPI_Wtime();
93
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);
97             }
98             t_put = (MPI_Wtime() - t_put) / num_iter;
99
100             for (test_iter = 0; test_iter < num_iter + NUM_WARMUP_ITER; test_iter++) {
101                 if (test_iter == NUM_WARMUP_ITER)
102                     t_acc = MPI_Wtime();
103
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);
108             }
109             t_acc = (MPI_Wtime() - t_acc) / num_iter;
110
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);
116         }
117     }
118
119     MPI_Barrier(MPI_COMM_WORLD);
120
121     MPI_Win_free(&win);
122     MPI_Free_mem(win_buf);
123     MPI_Free_mem(buf);
124 }
125
126 int main(int argc, char **argv)
127 {
128     MTest_Init(&argc, &argv);
129
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);
134
135     MTest_Finalize(0);
136     MPI_Finalize();
137
138     return 0;
139 }