client_server_mapping.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*!
  2. \file client_server_mapping.hpp
  3. \author Ha NGUYEN
  4. \since 04 Feb 2015
  5. \date 09 Mars 2015
  6. \brief Mapping between index client and server.
  7. */
  8. #include "client_server_mapping.hpp"
  9. namespace xios {
  10. CClientServerMapping::CClientServerMapping()
  11. : indexGlobalOnServer_()
  12. {
  13. }
  14. CClientServerMapping::~CClientServerMapping()
  15. {
  16. }
  17. /*!
  18. Compute how many clients each server will receive data from
  19. On client can send data to several servers as well as one server can receive data originated from
  20. some clients. In order to write data correctly, each server must know from how many clients it receives data
  21. \param [in] nbServer number of servers
  22. \param [in] nClient number of clients
  23. \param [in] clientIntraComm MPI communication of clients
  24. \param [in] connectedServerRank Rank of servers connected to one client
  25. */
  26. std::map<int,int> CClientServerMapping::computeConnectedClients(int nbServer, int nbClient,
  27. MPI_Comm& clientIntraComm,
  28. const std::vector<int>& connectedServerRank)
  29. {
  30. std::map<int, int> connectedClients; // number of clients connected to a server
  31. std::vector<int>::const_iterator itbVec, iteVec, it;
  32. itbVec = it = connectedServerRank.begin();
  33. iteVec = connectedServerRank.end();
  34. std::vector<int> connectedServer;
  35. std::vector<bool> isConnected(nbServer,false);
  36. for (it = itbVec; it != iteVec; ++it)
  37. {
  38. for (int serverNum = 0; serverNum < nbServer; ++serverNum)
  39. if (*it == serverNum) isConnected[serverNum] = true;
  40. }
  41. for(int serverNum = 0; serverNum<nbServer; ++serverNum)
  42. if (isConnected[serverNum])
  43. connectedServer.push_back(serverNum);
  44. int nbConnectedServer=connectedServer.size();
  45. int* recvCount=new int[nbClient];
  46. int* displ=new int[nbClient];
  47. int* sendBuff=new int[nbConnectedServer];
  48. valarray<int> clientRes(0,nbServer);
  49. for(int n=0;n<nbConnectedServer;n++) sendBuff[n]=connectedServer[n] ;
  50. // get connected server for everybody
  51. MPI_Allgather(&nbConnectedServer,1,MPI_INT,recvCount,1,MPI_INT,clientIntraComm) ;
  52. displ[0]=0 ;
  53. for(int n=1;n<nbClient;n++) displ[n]=displ[n-1]+recvCount[n-1] ;
  54. int recvSize=displ[nbClient-1]+recvCount[nbClient-1] ;
  55. int* recvBuff=new int[recvSize] ;
  56. MPI_Allgatherv(sendBuff,nbConnectedServer,MPI_INT,recvBuff,recvCount,displ,MPI_INT,clientIntraComm) ;
  57. for(int n=0;n<recvSize;n++) clientRes[recvBuff[n]]++ ;
  58. for(int n=0;n<nbConnectedServer;n++)
  59. {
  60. connectedClients[connectedServer[n]] = clientRes[connectedServer[n]];
  61. }
  62. delete [] recvCount ;
  63. delete [] displ ;
  64. delete [] sendBuff ;
  65. delete [] recvBuff ;
  66. return connectedClients;
  67. }
  68. /*!
  69. Return global index of data on each connected server.
  70. On receiving data sent from client(s), each server with this global index, is able to
  71. know where the data should be written.
  72. \return mapping of server rank and its global index.
  73. */
  74. const CClientServerMapping::GlobalIndexMap& CClientServerMapping::getGlobalIndexOnServer() const
  75. {
  76. return indexGlobalOnServer_;
  77. }
  78. CClientServerMapping::GlobalIndexMap& CClientServerMapping::getGlobalIndexOnServer()
  79. {
  80. return indexGlobalOnServer_;
  81. }
  82. } //namespace xios