Ignore:
Timestamp:
09/10/18 17:18:33 (6 years ago)
Author:
oabramkina
Message:

Adding a check on the client side if all servers have data to receive. If servers have no data to receive the master process will send empty data to such servers. This ensures that all servers participate in collective calls.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_olga/src/node/domain.cpp

    r1571 r1576  
    18481848          // Even if a client has no index, it must connect to at least one server and 
    18491849          // send an "empty" data to this server 
    1850 //          if (connectedServerRank_[nbServer].empty()) 
    1851 //            connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 
    1852  
    1853           // Trying instead: send empty data to all servers 
    18541850          if (connectedServerRank_[nbServer].empty()) 
    1855             for (int i = 0; i < client->serverSize; ++i) 
    1856             connectedServerRank_[nbServer].push_back(i); 
    1857  
    1858  
     1851            connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 
     1852 
     1853          // Now check if all servers have data to receive. If not, master client will send empty data. 
     1854          // This ensures that all servers will participate in collective calls upon receiving even if they have no date to receive. 
     1855          std::vector<int> counts (clientSize); 
     1856          std::vector<int> displs (clientSize); 
     1857          displs[0] = 0; 
     1858          int localCount = connectedServerRank_[nbServer].size() ; 
     1859          MPI_Gather(&localCount, 1, MPI_INT, &counts[0], 1, MPI_INT, 0, client->intraComm) ; 
     1860          for (int i = 0; i < clientSize-1; ++i) 
     1861          { 
     1862            displs[i+1] = displs[i] + counts[i]; 
     1863          } 
     1864          std::vector<int> allConnectedServers(displs[clientSize-1]+counts[clientSize-1]); 
     1865          MPI_Gatherv(&(connectedServerRank_[nbServer])[0], localCount, MPI_INT, &allConnectedServers[0], &counts[0], &displs[0], MPI_INT, 0, client->intraComm); 
     1866 
     1867          if ((allConnectedServers.size() != nbServer) && (rank == 0)) 
     1868          { 
     1869            std::vector<bool> isSrvConnected (nbServer, false); 
     1870            for (int i = 0; i < allConnectedServers.size(); ++i) isSrvConnected[allConnectedServers[i]] = true; 
     1871            for (int i = 0; i < nbServer; ++i) 
     1872            { 
     1873              if (!isSrvConnected[i]) connectedServerRank_[nbServer].push_back(i); 
     1874            } 
     1875          } 
    18591876          nbSenders[nbServer] = clientServerMap->computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank_[nbServer]); 
    18601877          delete clientServerMap; 
Note: See TracChangeset for help on using the changeset viewer.