Ignore:
Timestamp:
07/31/17 17:59:25 (7 years ago)
Author:
mhnguyen
Message:

Fixing the blocking problem where there are more servers than the number of grid band distribution

+) Correct this problem not only for writing but also for reading
+) Allow "zero-size" domain, axis (i.e: domain, axis with ni = 0, and/or nj=0)

Test
+) On Curie
+) Work in both cases: Read and Write data

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/XIOS_DEV_CMIP6/src/context_client.cpp

    r1201 r1232  
    3535      else  MPI_Comm_size(interComm, &serverSize); 
    3636 
     37      computeLeader(clientRank, clientSize, serverSize, ranksServerLeader, ranksServerNotLeader); 
     38 
     39      timeLine = 0; 
     40    } 
     41 
     42    void CContextClient::computeLeader(int clientRank, int clientSize, int serverSize, 
     43                                       std::list<int>& rankRecvLeader, 
     44                                       std::list<int>& rankRecvNotLeader) 
     45    { 
     46      if ((0 == clientSize) || (0 == serverSize)) return; 
     47 
    3748      if (clientSize < serverSize) 
    3849      { 
     
    5061 
    5162        for (int i = 0; i < serverByClient; i++) 
    52           ranksServerLeader.push_back(rankStart + i); 
    53  
    54         ranksServerNotLeader.resize(0); 
     63          rankRecvLeader.push_back(rankStart + i); 
     64 
     65        rankRecvNotLeader.resize(0); 
    5566      } 
    5667      else 
     
    6273        { 
    6374          if (clientRank % (clientByServer + 1) == 0) 
    64             ranksServerLeader.push_back(clientRank / (clientByServer + 1)); 
     75            rankRecvLeader.push_back(clientRank / (clientByServer + 1)); 
    6576          else 
    66             ranksServerNotLeader.push_back(clientRank / (clientByServer + 1)); 
     77            rankRecvNotLeader.push_back(clientRank / (clientByServer + 1)); 
    6778        } 
    6879        else 
     
    7081          int rank = clientRank - (clientByServer + 1) * remain; 
    7182          if (rank % clientByServer == 0) 
    72             ranksServerLeader.push_back(remain + rank / clientByServer); 
     83            rankRecvLeader.push_back(remain + rank / clientByServer); 
    7384          else 
    74             ranksServerNotLeader.push_back(remain + rank / clientByServer); 
    75         } 
    76       } 
    77  
    78       timeLine = 0; 
     85            rankRecvNotLeader.push_back(remain + rank / clientByServer); 
     86        } 
     87      } 
    7988    } 
    8089 
Note: See TracChangeset for help on using the changeset viewer.