1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
4 * (C) 2013 by Argonne National Laboratory.
5 * See COPYRIGHT in top-level directory.
14 /* Test the given operation within a Fence epoch */
15 #define TEST_FENCE_OP(op_name_, fcn_call_) \
21 MTestPrintErrorMsg( "Zero-byte op " op_name_, err ); \
24 err = MPI_Win_fence( 0, win ); \
28 MTestPrintErrorMsg( "Fence after " op_name_, err ); \
34 /* Test the given operation within a passive target epoch */
35 #define TEST_PT_OP(op_name_, fcn_call_) \
37 err = MPI_Win_lock(MPI_LOCK_EXCLUSIVE, TARGET, 0, win); \
41 MTestPrintErrorMsg( "Lock before" op_name_, err ); \
48 MTestPrintErrorMsg( "Zero-byte op " op_name_, err ); \
51 err = MPI_Win_unlock( TARGET, win ); \
55 MTestPrintErrorMsg( "Unlock after " op_name_, err ); \
61 /* Test the given request-based operation within a passive target epoch */
62 #define TEST_REQ_OP(op_name_, req_, fcn_call_) \
64 err = MPI_Win_lock(MPI_LOCK_EXCLUSIVE, TARGET, 0, win); \
68 MTestPrintErrorMsg( "Lock before" op_name_, err ); \
75 MTestPrintErrorMsg( "Zero-byte op " op_name_, err ); \
78 err = MPI_Win_unlock( TARGET, win ); \
82 MTestPrintErrorMsg( "Unlock after " op_name_, err ); \
85 err = MPI_Wait( &req_, MPI_STATUS_IGNORE ); \
89 MTestPrintErrorMsg( "Wait after " op_name_, err ); \
95 static char MTEST_Descrip[] = "Test handling of zero-byte transfers";
98 int main( int argc, char *argv[] )
104 int *rmabuf, rsize, rcount;
109 MTest_Init( &argc, &argv );
111 bufsize = 256 * sizeof(int);
112 buf = (int *)malloc( bufsize );
114 fprintf( stderr, "Unable to allocated %d bytes\n", bufsize );
115 MPI_Abort( MPI_COMM_WORLD, 1 );
117 result = (int *)malloc( bufsize );
119 fprintf( stderr, "Unable to allocated %d bytes\n", bufsize );
120 MPI_Abort( MPI_COMM_WORLD, 1 );
123 rsize = rcount * sizeof(int);
124 rmabuf = (int *)malloc( rsize );
126 fprintf( stderr, "Unable to allocated %d bytes\n", rsize );
127 MPI_Abort( MPI_COMM_WORLD, 1 );
130 /* The following loop is used to run through a series of communicators
131 * that are subsets of MPI_COMM_WORLD, of size 1 or greater. */
132 while (MTestGetIntracommGeneral( &comm, 1, 1 )) {
135 if (comm == MPI_COMM_NULL) continue;
136 /* Determine the sender and receiver */
137 MPI_Comm_rank( comm, &rank );
138 MPI_Comm_size( comm, &size );
140 MPI_Win_create( buf, bufsize, sizeof(int), MPI_INFO_NULL, comm, &win );
141 /* To improve reporting of problems about operations, we
142 change the error handler to errors return */
143 MPI_Win_set_errhandler( win, MPI_ERRORS_RETURN );
145 /** TEST OPERATIONS USING ACTIVE TARGET (FENCE) SYNCHRONIZATION **/
146 MPI_Win_fence( 0, win );
149 MPI_Put( rmabuf, count, MPI_INT, TARGET, 0,
150 count, MPI_INT, win );
154 MPI_Get( rmabuf, count, MPI_INT, TARGET, 0,
155 count, MPI_INT, win );
157 TEST_FENCE_OP("Accumulate",
158 MPI_Accumulate( rmabuf, count, MPI_INT, TARGET,
159 0, count, MPI_INT, MPI_SUM, win );
161 TEST_FENCE_OP("Get accumulate",
162 MPI_Get_accumulate( rmabuf, count, MPI_INT, result,
163 count, MPI_INT, TARGET, 0,
164 count, MPI_INT, MPI_SUM, win );
166 /* Note: It's not possible to generate a zero-byte FOP or CAS */
168 /** TEST OPERATIONS USING PASSIVE TARGET SYNCHRONIZATION **/
171 MPI_Put( rmabuf, count, MPI_INT, TARGET, 0, count,
175 MPI_Get( rmabuf, count, MPI_INT, TARGET, 0, count,
178 TEST_PT_OP("Accumulate",
179 MPI_Accumulate( rmabuf, count, MPI_INT, TARGET, 0,
180 count, MPI_INT, MPI_SUM, win );
182 TEST_PT_OP("Get accumulate",
183 MPI_Get_accumulate( rmabuf, count, MPI_INT, result, count,
184 MPI_INT, TARGET, 0, count,
185 MPI_INT, MPI_SUM, win );
188 /* Note: It's not possible to generate a zero-byte FOP or CAS */
190 /** TEST REQUEST-BASED OPERATIONS (PASSIVE TARGET ONLY) **/
192 TEST_REQ_OP("Rput", req,
193 MPI_Rput( rmabuf, count, MPI_INT, TARGET, 0, count,
194 MPI_INT, win, &req );
196 TEST_REQ_OP("Rget", req,
197 MPI_Rget( rmabuf, count, MPI_INT, TARGET, 0, count,
198 MPI_INT, win, &req );
200 TEST_REQ_OP("Raccumulate", req,
201 MPI_Raccumulate( rmabuf, count, MPI_INT, TARGET, 0,
202 count, MPI_INT, MPI_SUM, win, &req );
204 TEST_REQ_OP("Rget_accumulate", req,
205 MPI_Rget_accumulate( rmabuf, count, MPI_INT, result,
206 count, MPI_INT, TARGET, 0,
207 count, MPI_INT, MPI_SUM, win, &req );
210 MPI_Win_free( &win );
211 MTestFreeComm(&comm);
217 MTest_Finalize( errs );