1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
25 #include "MPIAccessTest.hxx"
26 #include <cppunit/TestAssert.h>
28 //#include "CommInterface.hxx"
29 //#include "ProcessorGroup.hxx"
30 //#include "MPIProcessorGroup.hxx"
31 #include "MPIAccess.hxx"
33 // use this define to enable lines, execution of which leads to Segmentation Fault
36 // use this define to enable CPPUNIT asserts and fails, showing bugs
37 #define ENABLE_FORCED_FAILURES
40 using namespace ParaMEDMEM;
42 void MPIAccessTest::test_MPI_Access_ISend_IRecv_Length_1() {
44 // MPI_Init(&argc, &argv) ;
48 MPI_Comm_size(MPI_COMM_WORLD,&size) ;
49 MPI_Comm_rank(MPI_COMM_WORLD,&myrank) ;
52 ostringstream strstream ;
53 strstream << "test_MPI_Access_ISend_IRecv_Length_1 must be runned with 2 procs" << endl ;
54 cout << strstream.str() << endl ;
55 CPPUNIT_FAIL( strstream.str() ) ;
58 cout << "test_MPI_Access_ISend_IRecv_Length_1" << myrank << endl ;
60 ParaMEDMEM::CommInterface interface ;
62 ParaMEDMEM::MPIProcessorGroup* group = new ParaMEDMEM::MPIProcessorGroup(interface) ;
64 ParaMEDMEM::MPIAccess mpi_access( group ) ;
69 mpi_access.barrier() ;
74 int target = 1 - myrank ;
75 int SendRequestId[maxreq] ;
76 int RecvRequestId[maxreq] ;
78 int sendbuf[1000*(maxreq-1)] ;
79 int recvbuf[maxreq-1][1000*(maxreq-1)] ;
82 RecvRequestId[0] = -1 ;
83 for ( i = 0 ; i < 1000*(maxreq-1) ; i++ ) {
86 for ( i = 0 ; i < maxreq ; i++ ) {
89 sts = mpi_access.ISend( sendbuf, 1000*i, MPI_INT, target, SendRequestId[i] ) ;
90 cout << "test" << myrank << " ISend RequestId " << SendRequestId[i]
91 << " tag " << mpi_access.sendMPITag(target) << endl ;
94 for (j = 1 ; j <= i ; j++) {
96 MPI_Datatype datatype ;
100 mpi_access.test( SendRequestId[j], flag ) ;
104 sts = mpi_access.IProbe( target , source, MPITag, datatype,
106 char msgerr[MPI_MAX_ERROR_STRING] ;
108 mpi_access.errorString(sts, msgerr, &lenerr) ;
109 cout << "test" << myrank << " IProbe lenerr " << lenerr << " "
111 if ( sts != MPI_SUCCESS ) {
112 ostringstream strstream ;
113 strstream << "==========================================================="
114 << "test" << myrank << " IProbe KO"
115 << "==========================================================="
117 cout << strstream.str() << endl ;
118 CPPUNIT_FAIL( strstream.str() ) ;
120 cout << "test" << myrank << " IProbe i/j " << i << "/" << j
121 << " MPITag " << MPITag << " datatype " << datatype
122 << " outcount " << outcount << " flag " << flag << endl ;
126 int target, tag, error, outcount ;
127 mpi_access.status( SendRequestId[j], target, tag, error, outcount,
129 cout << "test" << myrank << " Test(Send RequestId " << SendRequestId[j]
130 << ") : target " << target << " tag " << tag << " error " << error
131 << " flag " << flag << endl ;
134 sts = mpi_access.IRecv( recvbuf[maxirecv], outcount, datatype, source,
135 RecvRequestId[maxirecv] ) ;
136 cout << "test" << myrank << " maxirecv " << maxirecv << " IRecv RequestId "
137 << RecvRequestId[maxirecv] << " source " << source
138 << " outcount " << outcount << " tag "
139 << mpi_access.recvMPITag(target) << endl ;
140 maxirecv = maxirecv + 1 ;
143 else if ( myrank == 1 && i == maxreq-1 && j >= maxirecv ) {
144 sts = mpi_access.IRecv( recvbuf[j], 1000*j, MPI_INT, target,
146 cout << "test" << myrank << " maxirecv " << maxirecv << " IRecv RequestId "
147 << RecvRequestId[j] << " target " << target << " length " << 1000*j
148 << " tag " << mpi_access.recvMPITag(target) << endl ;
149 maxirecv = maxirecv + 1 ;
152 char msgerr[MPI_MAX_ERROR_STRING] ;
154 mpi_access.errorString(sts, msgerr, &lenerr) ;
155 cout << "test" << myrank << " lenerr " << lenerr << " "
158 if ( sts != MPI_SUCCESS ) {
159 ostringstream strstream ;
160 strstream << "==========================================================="
161 << endl << "test" << myrank << " KO" << endl
162 << "==========================================================="
164 cout << strstream.str() << endl ;
165 CPPUNIT_FAIL( strstream.str() ) ;
172 mpi_access.testAll( maxreq, SendRequestId, flag ) ;
173 cout << "test" << myrank << " TestAll SendRequest flag " << flag << endl ;
180 if ( maxirecv != maxreq ) {
181 ostringstream strstream ;
182 strstream << "==========================================================="
183 << endl << "test" << myrank << " KO" << " maxirecv " << maxirecv
184 << " != maxreq " << maxreq << endl
185 << "==========================================================="
187 cout << strstream.str() << endl ;
188 CPPUNIT_FAIL( strstream.str() ) ;
190 while ( maxirecv > 0 ) {
191 for ( i = 1 ; i < maxreq ; i++ ) {
192 cout << "test" << myrank << " IProbe : " << endl ;
193 sts = mpi_access.test( RecvRequestId[i] , flag ) ;
194 char msgerr[MPI_MAX_ERROR_STRING] ;
196 mpi_access.errorString(sts, msgerr, &lenerr) ;
197 cout << "test" << myrank << " flag " << flag << " lenerr "
198 << lenerr << " " << msgerr << " maxirecv " << maxirecv << endl ;
199 if ( sts != MPI_SUCCESS ) {
200 ostringstream strstream ;
201 strstream << "==========================================================="
202 << "test" << myrank << " KO"
203 << "==========================================================="
205 cout << strstream.str() << endl ;
206 CPPUNIT_FAIL( strstream.str() ) ;
208 cout << "test" << myrank << " Test flag " << flag << endl ;
211 mpi_access.status( RecvRequestId[i] , source , tag , error ,
214 if ( outcount != 1000*i |
215 (recvbuf[i][outcount-1] != (outcount-1)) ) {
216 ostringstream strstream ;
217 strstream << "========================================================"
218 << endl << "test" << myrank << " outcount " << outcount
219 << " KO" << " i " << i
220 << " recvbuf " << recvbuf[i][outcount-1] << endl
221 << "========================================================"
223 cout << strstream.str() << endl ;
224 CPPUNIT_FAIL( strstream.str() ) ;
227 else if ( outcount != 0 ) {
228 ostringstream strstream ;
229 strstream << "========================================================"
230 << endl << "test" << myrank << " outcount " << outcount
231 << " KO" << " i " << i << endl
232 << "========================================================"
234 cout << strstream.str() << endl ;
235 CPPUNIT_FAIL( strstream.str() ) ;
237 maxirecv = maxirecv - 1 ;
241 mpi_access.testAll( maxreq, RecvRequestId, flag ) ;
242 cout << "test" << myrank << " TestAll RecvRequest flag " << flag << endl ;
245 cout << "test" << myrank << " WaitAll :" << endl ;
247 mpi_access.waitAll( maxreq, SendRequestId ) ;
248 mpi_access.deleteRequests( maxreq, SendRequestId ) ;
251 mpi_access.waitAll( maxreq, RecvRequestId ) ;
252 mpi_access.deleteRequests( maxreq, RecvRequestId ) ;
256 int sendrequests[maxreq] ;
257 int sendreqsize = mpi_access.sendRequestIds( target , maxreq , sendrequests ) ;
258 sendreqsize = mpi_access.sendRequestIds( target , maxreq , sendrequests ) ;
259 if ( sendreqsize != 0 ) {
260 ostringstream strstream ;
261 strstream << "=========================================================" << endl
262 << "test" << myrank << " sendreqsize " << sendreqsize << " KO" << endl
263 << "=========================================================" << endl ;
264 cout << strstream.str() << endl ;
265 CPPUNIT_FAIL( strstream.str() ) ;
268 cout << "=========================================================" << endl
269 << "test" << myrank << " sendreqsize " << sendreqsize << " OK" << endl
270 << "=========================================================" << endl ;
274 int recvrequests[maxreq] ;
275 int recvreqsize = mpi_access.sendRequestIds( target , maxreq , recvrequests ) ;
276 if ( recvreqsize != 0 ) {
277 ostringstream strstream ;
278 strstream << "=========================================================" << endl
279 << "test" << myrank << " recvreqsize " << recvreqsize << " KO" << endl
280 << "=========================================================" << endl ;
281 cout << strstream.str() << endl ;
282 CPPUNIT_FAIL( strstream.str() ) ;
285 cout << "=========================================================" << endl
286 << "test" << myrank << " recvreqsize " << recvreqsize << " OK" << endl
287 << "=========================================================" << endl ;
291 mpi_access.barrier() ;
297 cout << "test" << myrank << " OK" << endl ;