XIOS  1.0
Xml I/O Server
 Tout Classes Espaces de nommage Fichiers Fonctions Variables Définitions de type Énumérations Valeurs énumérées Amis Macros
client_server_mapping.cpp
Aller à la documentation de ce fichier.
1 
10 
11 namespace xios {
12 
14  : indexGlobalOnServer_()
15 {
16 }
17 
19 {
20 }
21 
31 std::map<int,int> CClientServerMapping::computeConnectedClients(int nbServer, int nbClient,
32  MPI_Comm& clientIntraComm,
33  const std::vector<int>& connectedServerRank)
34 {
35  std::map<int, int> connectedClients; // number of clients connected to a server
36 
37  std::vector<int>::const_iterator itbVec, iteVec, it;
38  itbVec = it = connectedServerRank.begin();
39  iteVec = connectedServerRank.end();
40 
41  std::vector<int> connectedServer;
42  std::vector<bool> isConnected(nbServer,false);
43 
44  for (it = itbVec; it != iteVec; ++it)
45  {
46  for (int serverNum = 0; serverNum < nbServer; ++serverNum)
47  if (*it == serverNum) isConnected[serverNum] = true;
48  }
49 
50  for(int serverNum = 0; serverNum<nbServer; ++serverNum)
51  if (isConnected[serverNum])
52  connectedServer.push_back(serverNum);
53 
54 
55  int nbConnectedServer=connectedServer.size();
56  int* recvCount=new int[nbClient];
57  int* displ=new int[nbClient];
58  int* sendBuff=new int[nbConnectedServer];
59  valarray<int> clientRes(0,nbServer);
60 
61  for(int n=0;n<nbConnectedServer;n++) sendBuff[n]=connectedServer[n] ;
62 
63  // get connected server for everybody
64  MPI_Allgather(&nbConnectedServer,1,MPI_INT,recvCount,1,MPI_INT,clientIntraComm) ;
65 
66  displ[0]=0 ;
67  for(int n=1;n<nbClient;n++) displ[n]=displ[n-1]+recvCount[n-1] ;
68  int recvSize=displ[nbClient-1]+recvCount[nbClient-1] ;
69  int* recvBuff=new int[recvSize] ;
70 
71 
72  MPI_Allgatherv(sendBuff,nbConnectedServer,MPI_INT,recvBuff,recvCount,displ,MPI_INT,clientIntraComm) ;
73  for(int n=0;n<recvSize;n++) clientRes[recvBuff[n]]++ ;
74 
75  for(int n=0;n<nbConnectedServer;n++)
76  {
77  connectedClients[connectedServer[n]] = clientRes[connectedServer[n]];
78  }
79 
80  delete [] recvCount ;
81  delete [] displ ;
82  delete [] sendBuff ;
83  delete [] recvBuff ;
84 
85  return connectedClients;
86 }
87 
95 {
96  return indexGlobalOnServer_;
97 }
98 
100 {
101  return indexGlobalOnServer_;
102 }
103 
104 } //namespace xios
#define xios(arg)
const GlobalIndexMap & getGlobalIndexOnServer() const
Return global index of data on each connected server.
std::unordered_map< int, std::vector< size_t > > GlobalIndexMap
Mapping between index client and server.
GlobalIndexMap indexGlobalOnServer_
Global index of data on SERVER, which are calculated by client(s)
static std::map< int, int > computeConnectedClients(int nbServer, int nbClient, MPI_Comm &clientIntraComm, const std::vector< int > &connectedServerRank)
Compute how many clients each server will receive data from On client can send data to several server...