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/grid.cpp

    r1571 r1576  
    841841         // Even if a client has no index, it must connect to at least one server and 
    842842         // send an "empty" data to this server 
    843 //         if (connectedServerRank_[receiverSize].empty()) 
    844 //          connectedServerRank_[receiverSize].push_back(client->clientRank % client->serverSize); 
    845  
    846          // Trying instead: send empty data to all servers 
    847843         if (connectedServerRank_[receiverSize].empty()) 
    848            for (int i = 0; i < client->serverSize; ++i) 
    849            connectedServerRank_[receiverSize].push_back(i); 
     844          connectedServerRank_[receiverSize].push_back(client->clientRank % client->serverSize); 
     845 
     846         // Now check if all servers have data to receive. If not, master client will send empty data. 
     847         // This ensures that all servers will participate in collective calls upon receiving even if they have no date to receive. 
     848         std::vector<int> counts (client->clientSize); 
     849         std::vector<int> displs (client->clientSize); 
     850         displs[0] = 0; 
     851         int localCount = connectedServerRank_[receiverSize].size() ; 
     852         MPI_Gather(&localCount, 1, MPI_INT, &counts[0], 1, MPI_INT, 0, client->intraComm) ; 
     853         for (int i = 0; i < client->clientSize-1; ++i) 
     854         { 
     855           displs[i+1] = displs[i] + counts[i]; 
     856         } 
     857         std::vector<int> allConnectedServers(displs[client->clientSize-1]+counts[client->clientSize-1]); 
     858         MPI_Gatherv(&(connectedServerRank_[receiverSize])[0], localCount, MPI_INT, &allConnectedServers[0], &counts[0], &displs[0], MPI_INT, 0, client->intraComm); 
     859 
     860         if ((allConnectedServers.size() != receiverSize) && (client->clientRank == 0)) 
     861         { 
     862           std::vector<bool> isSrvConnected (receiverSize, false); 
     863           for (int i = 0; i < allConnectedServers.size(); ++i) isSrvConnected[allConnectedServers[i]] = true; 
     864           for (int i = 0; i < receiverSize; ++i) 
     865           { 
     866             if (!isSrvConnected[i]) connectedServerRank_[receiverSize].push_back(i); 
     867           } 
     868         } 
    850869 
    851870         nbSenders[receiverSize] = clientServerMap_->computeConnectedClients(receiverSize, client->clientSize, client->intraComm, connectedServerRank_[receiverSize]); 
Note: See TracChangeset for help on using the changeset viewer.