2 /* Creator: Bronis R. de Supinski (bronis@llnl.gov) */
3 /* change-send-buffer-exhaustive.c -- do lots pt-2-pt ops with */
4 /* send buffer overwrite errors*/
8 "$Header: /usr/gapps/asde/cvs-vault/umpire/tests/change-send-buffer-exhaustive.c,v 1.5 2002/10/24 17:04:54 bronis Exp $";
17 #define NUM_SEND_TYPES 8
18 #define NUM_PERSISTENT_SEND_TYPES 4
19 #define NUM_BSEND_TYPES 2
20 #define NUM_COMPLETION_MECHANISMS 8
23 main (int argc, char **argv)
27 MPI_Comm comm = MPI_COMM_WORLD;
28 char processor_name[128];
30 int bbuf[(BUF_SIZE + MPI_BSEND_OVERHEAD) * 2 * NUM_BSEND_TYPES];
31 int buf[BUF_SIZE * 2 * NUM_SEND_TYPES];
32 int i, j, k, at_size, send_t_number, index, outcount, total, flag;
33 int num_errors, error_count, indices[2 * NUM_SEND_TYPES];
34 MPI_Request aReq[2 * NUM_SEND_TYPES];
35 MPI_Status aStatus[2 * NUM_SEND_TYPES];
38 MPI_Init (&argc, &argv);
39 MPI_Comm_size (comm, &nprocs);
40 MPI_Comm_rank (comm, &rank);
41 MPI_Get_processor_name (processor_name, &namelen);
42 printf ("(%d) is alive on %s\n", rank, processor_name);
45 MPI_Buffer_attach (bbuf, sizeof(int) *
46 (BUF_SIZE + MPI_BSEND_OVERHEAD) * 2 * NUM_BSEND_TYPES);
49 /* set up persistent sends... */
50 send_t_number = NUM_SEND_TYPES - NUM_PERSISTENT_SEND_TYPES;
52 MPI_Send_init (&buf[send_t_number * 2 * BUF_SIZE], BUF_SIZE, MPI_INT,
53 1, send_t_number * 2, comm, &aReq[send_t_number * 2]);
54 MPI_Send_init (&buf[(send_t_number * 2 + 1) * BUF_SIZE],
55 BUF_SIZE, MPI_INT, 1, send_t_number * 2 + 1,
56 comm, &aReq[send_t_number * 2 + 1]);
60 MPI_Bsend_init (&buf[send_t_number * 2 * BUF_SIZE], BUF_SIZE, MPI_INT,
61 1, send_t_number * 2, comm, &aReq[send_t_number * 2]);
62 MPI_Bsend_init (&buf[(send_t_number * 2 + 1) * BUF_SIZE],
63 BUF_SIZE, MPI_INT, 1, send_t_number * 2 + 1,
64 comm, &aReq[send_t_number * 2 + 1]);
69 MPI_Rsend_init (&buf[send_t_number * 2 * BUF_SIZE], BUF_SIZE, MPI_INT,
70 1, send_t_number * 2, comm, &aReq[send_t_number * 2]);
71 MPI_Rsend_init (&buf[(send_t_number * 2 + 1) * BUF_SIZE],
72 BUF_SIZE, MPI_INT, 1, send_t_number * 2 + 1,
73 comm, &aReq[send_t_number * 2 + 1]);
77 MPI_Ssend_init (&buf[send_t_number * 2 * BUF_SIZE], BUF_SIZE, MPI_INT,
78 1, send_t_number * 2, comm, &aReq[send_t_number * 2]);
79 MPI_Ssend_init (&buf[(send_t_number * 2 + 1) * BUF_SIZE],
80 BUF_SIZE, MPI_INT, 1, send_t_number * 2 + 1,
81 comm, &aReq[send_t_number * 2 + 1]);
84 for (k = 0; k < (NUM_COMPLETION_MECHANISMS * 2); k++) {
86 /* initialize all of the send buffers */
87 for (j = 0; j < NUM_SEND_TYPES; j++) {
88 for (i = 0; i < BUF_SIZE; i++) {
89 buf[2 * j * BUF_SIZE + i] = i;
90 buf[((2 * j + 1) * BUF_SIZE) + i] = BUF_SIZE - 1 - i;
95 /* zero out all of the receive buffers */
96 bzero (buf, sizeof(int) * BUF_SIZE * 2 * NUM_SEND_TYPES);
99 MPI_Barrier(MPI_COMM_WORLD);
102 /* set up transient sends... */
105 MPI_Isend (&buf[send_t_number * 2 * BUF_SIZE], BUF_SIZE, MPI_INT,
106 1, send_t_number * 2, comm, &aReq[send_t_number * 2]);
107 MPI_Isend (&buf[(send_t_number * 2 + 1) * BUF_SIZE],
108 BUF_SIZE, MPI_INT, 1, send_t_number * 2 + 1,
109 comm, &aReq[send_t_number * 2 + 1]);
113 MPI_Ibsend (&buf[send_t_number * 2 * BUF_SIZE], BUF_SIZE, MPI_INT,
114 1, send_t_number * 2, comm, &aReq[send_t_number * 2]);
115 MPI_Ibsend (&buf[(send_t_number * 2 + 1) * BUF_SIZE],
116 BUF_SIZE, MPI_INT, 1, send_t_number * 2 + 1,
117 comm, &aReq[send_t_number * 2 + 1]);
121 /* Barrier to ensure receives are posted for rsends... */
122 MPI_Barrier(MPI_COMM_WORLD);
124 MPI_Irsend (&buf[send_t_number * 2 * BUF_SIZE], BUF_SIZE, MPI_INT,
125 1, send_t_number * 2, comm, &aReq[send_t_number * 2]);
126 MPI_Irsend (&buf[(send_t_number * 2 + 1) * BUF_SIZE],
127 BUF_SIZE, MPI_INT, 1, send_t_number * 2 + 1,
128 comm, &aReq[send_t_number * 2 + 1]);
132 MPI_Issend (&buf[send_t_number * 2 * BUF_SIZE], BUF_SIZE, MPI_INT,
133 1, send_t_number * 2, comm, &aReq[send_t_number * 2]);
134 MPI_Issend (&buf[(send_t_number * 2 + 1) * BUF_SIZE],
135 BUF_SIZE, MPI_INT, 1, send_t_number * 2 + 1,
136 comm, &aReq[send_t_number * 2 + 1]);
138 /* just to be paranoid */
140 assert (send_t_number == NUM_SEND_TYPES - NUM_PERSISTENT_SEND_TYPES);
142 /* start the persistent sends... */
144 MPI_Startall (NUM_PERSISTENT_SEND_TYPES * 2, &aReq[2 * send_t_number]);
147 for (j = 0; j < NUM_PERSISTENT_SEND_TYPES * 2; j++) {
148 MPI_Start (&aReq[2 * send_t_number + j]);
152 /* NOTE: Changing the send buffer of a Bsend is NOT an error... */
153 for (j = 0; j < NUM_SEND_TYPES; j++) {
154 /* muck the buffers */
155 buf[j * 2 * BUF_SIZE + (BUF_SIZE >> 1)] = BUF_SIZE;
158 printf ("USER MSG: 6 change send buffer errors in iteration #%d:\n", k);
160 /* complete the sends */
164 for (j = 0; j < NUM_SEND_TYPES * 2; j++) {
165 MPI_Wait (&aReq[j], &aStatus[j]);
170 /* use MPI_Waitall */
171 MPI_Waitall (NUM_SEND_TYPES * 2, aReq, aStatus);
175 /* use MPI_Waitany */
176 for (j = 0; j < NUM_SEND_TYPES * 2; j++) {
177 MPI_Waitany (NUM_SEND_TYPES * 2, aReq, &index, aStatus);
183 /* use MPI_Waitsome */
185 while (total < NUM_SEND_TYPES * 2) {
186 MPI_Waitsome (NUM_SEND_TYPES * 2, aReq, &outcount, indices, aStatus);
195 for (j = 0; j < NUM_SEND_TYPES * 2; j++) {
199 MPI_Test (&aReq[j], &flag, &aStatus[j]);
206 /* use MPI_Testall */
209 MPI_Testall (NUM_SEND_TYPES * 2, aReq, &flag, aStatus);
215 /* use MPI_Testany */
216 for (j = 0; j < NUM_SEND_TYPES * 2; j++) {
219 MPI_Testany (NUM_SEND_TYPES * 2, aReq, &index, &flag, aStatus);
226 /* use MPI_Testsome */
228 while (total < NUM_SEND_TYPES * 2) {
232 MPI_Testsome (NUM_SEND_TYPES * 2, aReq,
233 &outcount, indices, aStatus);
246 else if (rank == 1) {
247 /* set up receives for all of the sends */
248 for (j = 0; j < NUM_SEND_TYPES * 2; j++) {
249 MPI_Irecv (&buf[j * BUF_SIZE], BUF_SIZE,
250 MPI_INT, 0, j, comm, &aReq[j]);
253 /* Barrier to ensure receives are posted for rsends... */
254 MPI_Barrier(MPI_COMM_WORLD);
256 /* complete all of the receives... */
257 MPI_Waitall (NUM_SEND_TYPES * 2, aReq, aStatus);
260 /* Barrier to ensure receives are posted for rsends... */
261 MPI_Barrier(MPI_COMM_WORLD);
265 MPI_Barrier(MPI_COMM_WORLD);
268 /* free the persistent requests */
269 for (i = 2* (NUM_SEND_TYPES - NUM_PERSISTENT_SEND_TYPES);
270 i < 2 * NUM_SEND_TYPES; i++) {
271 MPI_Request_free (&aReq[i]);
275 MPI_Buffer_detach (bbuf, &at_size);
278 sizeof(int) * (BUF_SIZE + MPI_BSEND_OVERHEAD) * 2 * NUM_BSEND_TYPES);
281 printf ("(%d) Finished normally\n", rank);