X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FParaMEDMEM%2FMPIAccess.cxx;h=1bb3dcf8a9a57443a23a1fcf04beff0d896a2a8b;hb=f100fdf8977ff06ab097b9a1d1400a26b16aebb9;hp=e4235a19a3429082800e0b43817f4a245cc7a94a;hpb=a20bf1b863ef76905bd57220f5a71f089eb1acba;p=tools%2Fmedcoupling.git diff --git a/src/ParaMEDMEM/MPIAccess.cxx b/src/ParaMEDMEM/MPIAccess.cxx index e4235a19a..1bb3dcf8a 100644 --- a/src/ParaMEDMEM/MPIAccess.cxx +++ b/src/ParaMEDMEM/MPIAccess.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -24,10 +24,13 @@ using namespace std; -namespace ParaMEDMEM +namespace MEDCoupling { - /*! \defgroup mpi_access MPIAccess - Class \a MPIAccess is the gateway to the MPI library. + /**! + \anchor MPIAccess-det + \class MPIAccess + + The class \a MPIAccess is the gateway to the MPI library. It is a helper class that gathers the calls to the MPI library that are made in the ParaMEDMEM library. This gathering allows easier gathering of information about the communication @@ -46,14 +49,14 @@ namespace ParaMEDMEM { //initialization MPI_Init(&argc, &argv); - ParaMEDMEM::CommInterface comm_interface; + MEDCoupling::CommInterface comm_interface; //setting up a processor group with proc 0 set procs; procs.insert(0); - ParaMEDMEM::ProcessorGroup group(procs, comm_interface); + MEDCoupling::ProcessorGroup group(procs, comm_interface); - ParaMEDMEM::MPIAccess mpi_access(group); + MEDCoupling::MPIAccess mpi_access(group); //cleanup MPI_Finalize(); @@ -134,7 +137,7 @@ namespace ParaMEDMEM array_of_displacements[0] = 0 ; array_of_displacements[1] = sizeof(double) ; array_of_displacements[2] = 2*sizeof(double) ; - MPI_Type_struct(3, array_of_blocklengths, array_of_displacements, + MPI_Type_create_struct(3, array_of_blocklengths, array_of_displacements, array_of_types, &_MPI_TIME) ; MPI_Type_commit(&_MPI_TIME) ; } @@ -167,7 +170,7 @@ namespace ParaMEDMEM "_MapOfRequestStruct". That structure RequestStruct give the possibility to manage the structures MPI_Request and MPI_Status * of MPI. It give - also the possibility to get informations about that request : + also the possibility to get information about that request : target, send/recv, tag, [a]synchronous, type, outcount. . That identifier is used to control an asynchronous request @@ -231,29 +234,29 @@ namespace ParaMEDMEM The default is [ 0 , MPI_TAG_UB], MPI_TAG_UB being the maximum value in an implementation of MPI (minimum 32767 = 2**15-1). On awa with the implementation lam MPI_TAG_UB value is - 7353944. The norma MPI specify that value is the same in all + 7353944. The norm MPI specify that value is the same in all processes started by mpirun. In the case of the use of the same IntraCommunicator in a process for several distinct data flows (or for several IntraCommunicators - with common processes), that permits to avoid ambibuity + with common processes), that permits to avoid ambiguity and may help debug. . In MPIAccess the tags have two parts (#define MODULO_TAG 10) : + The last decimal digit decimal correspond to MPI_DataType ( 1 for TimeMessages, 2 for MPI_INT and 3 for MPI_DOUBLE) - + The value of other digits correspond to a circular numero for each + + The value of other digits correspond to a circular number for each message. - + A TimeMessage and the associated DataMessage have the same numero + + A TimeMessage and the associated DataMessage have the same number (but the types are different and the tags also). . For a Send of a message from a process "source" to a process "target", we have _send_MPI_tag[target] in the process - source (it contains the last "tag" used for the Send of a pour l'envoi de + source (it contains the last "tag" used for the Send of a message to the process target). And in the process "target" which receive that message, we have _recv_MPI_Tag[source] (it contains the last "tag" used for the Recv of messages from the process source). - Naturally in the MPI norma the values of that tags must be the same. + Naturally in the MPI norm the values of that tags must be the same. */ int MPIAccess::newSendTag( MPI_Datatype datatype, int destrank , int method , bool asynchronous, int &RequestId ) @@ -388,7 +391,7 @@ namespace ParaMEDMEM // Receive (read) in synchronous mode count values of type datatype in buffer from source // (returns RequestId identifier even if the corresponding structure is deleted : // it is only in order to have the same signature as the asynchronous mode) - // The output argument OutCount is optionnal : *OutCount <= count + // The output argument OutCount is optional : *OutCount <= count int MPIAccess::recv(void* buffer, int count, MPI_Datatype datatype, int source, int &RequestId, int *OutCount) { int sts = MPI_SUCCESS ; @@ -785,7 +788,7 @@ namespace ParaMEDMEM source = aMPIStatus.MPI_SOURCE ; MPITag = aMPIStatus.MPI_TAG ; int MethodId = (MPITag % MODULO_TAG) ; - myDatatype = datatype( (ParaMEDMEM::_MessageIdent) MethodId ) ; + myDatatype = datatype( (MEDCoupling::_MessageIdent) MethodId ) ; _comm_interface.getCount(&aMPIStatus, myDatatype, &outcount ) ; if ( _trace ) cout << "MPIAccess::Probe" << _my_rank << " FromSource " << FromSource @@ -819,7 +822,7 @@ namespace ParaMEDMEM source = aMPIStatus.MPI_SOURCE ; MPITag = aMPIStatus.MPI_TAG ; int MethodId = (MPITag % MODULO_TAG) ; - myDataType = datatype( (ParaMEDMEM::_MessageIdent) MethodId ) ; + myDataType = datatype( (MEDCoupling::_MessageIdent) MethodId ) ; _comm_interface.getCount(&aMPIStatus, myDataType, &outcount ) ; if ( _trace ) cout << "MPIAccess::IProbe" << _my_rank << " FromSource " << FromSource @@ -862,9 +865,9 @@ namespace ParaMEDMEM int MPIAccess::cancel( int source, int theMPITag, MPI_Datatype datatype, int outcount, int &flag ) { int sts ; - MPI_Aint extent ; + MPI_Aint extent, lbound ; flag = 0 ; - sts = MPI_Type_extent( datatype , &extent ) ; + sts = MPI_Type_get_extent( datatype , &lbound, &extent ) ; if ( sts == MPI_SUCCESS ) { void * recvbuf = malloc( extent*outcount ) ; @@ -1000,7 +1003,7 @@ namespace ParaMEDMEM return _comm_interface.requestFree( request ) ; } - // Print all informations of all known requests for debugging purpose + // Print all information of all known requests for debugging purpose void MPIAccess::check() const { int i = 0 ; @@ -1036,24 +1039,24 @@ namespace ParaMEDMEM // Returns the MPI size of a TimeMessage MPI_Aint MPIAccess::timeExtent() const { - MPI_Aint aextent ; - MPI_Type_extent( _MPI_TIME , &aextent ) ; + MPI_Aint aextent, lbound ; + MPI_Type_get_extent( _MPI_TIME , &lbound, &aextent ) ; return aextent ; } // Returns the MPI size of a MPI_INT MPI_Aint MPIAccess::intExtent() const { - MPI_Aint aextent ; - MPI_Type_extent( MPI_INT , &aextent ) ; + MPI_Aint aextent, lbound ; + MPI_Type_get_extent( MPI_INT , &lbound, &aextent ) ; return aextent ; } // Returns the MPI size of a MPI_DOUBLE MPI_Aint MPIAccess::doubleExtent() const { - MPI_Aint aextent ; - MPI_Type_extent( MPI_DOUBLE , &aextent ) ; + MPI_Aint aextent, lbound ; + MPI_Type_get_extent( MPI_DOUBLE , &lbound, &aextent ) ; return aextent ; }