Changeset 2390


Ignore:
Timestamp:
07/29/22 13:51:58 (23 months ago)
Author:
jderouillat
Message:

Add a BANDS distribution in CDomain::computeRemoteElement regarding the number of servers and the number of clients.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS3/trunk/src/node/domain.cpp

    r2389 r2390  
    19941994      int nbClient = client->getIntraCommSize() ; 
    19951995      int rankClient = client->getIntraCommRank() ; 
    1996       int size = nbServer / nbClient ; 
     1996 
     1997      int nbChunk = max( nbServer, nbClient); 
     1998      int size ;//= nbChunk / nbClient ; 
    19971999      int start ; 
    1998       if (nbServer%nbClient > rankClient) 
    1999       { 
    2000        start = (size+1) * rankClient ; 
    2001        size++ ; 
    2002       } 
    2003       else start = size*rankClient + nbServer%nbClient ; 
     2000       
     2001      if (nbServer<=nbClient) // nbChunk = nbClient 
     2002      { 
     2003        // distribution regarding client only : 1 chunk per client, one server can recv from many clients (see serverRank below) 
     2004        size = 1; 
     2005        start = rankClient; 
     2006      } 
     2007      else // nbChunk = nbServer 
     2008      { 
     2009        // distribution regarding servers : 1 client with size(+1) chunk will send to size(+1)  servers 
     2010        size = nbChunk/nbClient; 
     2011        int nClientWithAdditionalChunk = nbChunk - size*nbClient; 
     2012        if (rankClient<nClientWithAdditionalChunk) // distribute size+1 chunks per client 
     2013        { 
     2014          size++; 
     2015          start =  size*rankClient; 
     2016        } 
     2017        else // distribute the rest with size chunks 
     2018        { 
     2019          start =  (size+1)*nClientWithAdditionalChunk+size*(rankClient-nClientWithAdditionalChunk); 
     2020        } 
     2021      } 
    20042022      
    20052023      for(int i=0; i<size; i++) 
    20062024      {  
    20072025        int rank=start+i ;  
    2008         size_t indSize = nj_glo/nbServer ; 
     2026        size_t indSize = nj_glo/nbChunk ; 
    20092027        size_t indStart ; 
    2010         if (nj_glo % nbServer > rank) 
     2028        if (nj_glo % nbChunk > rank) 
    20112029        { 
    20122030          indStart = (indSize+1) * rank ; 
    20132031          indSize++ ; 
    20142032        } 
    2015         else indStart = indSize*rank + nj_glo%nbServer ; 
     2033        else indStart = indSize*rank + nj_glo%nbChunk ; 
    20162034        
    20172035        indStart=indStart*ni_glo ; 
    20182036        indSize=indSize*ni_glo ; 
    2019         auto& globalInd =  globalIndex[rank] ; 
     2037        // compute the server rank concerns by the chunk 
     2038        int serverRank; 
     2039        if (nbServer<=nbClient) 
     2040        { 
     2041          // nChunkPerServer(+1) client will send to 1 server 
     2042          int nChunkPerServer = nbChunk/nbServer; 
     2043          int nServerWithAdditionalChunk = nbChunk - nChunkPerServer*nbServer; 
     2044          if (rankClient<nServerWithAdditionalChunk*(nChunkPerServer+1)) 
     2045          { 
     2046            serverRank = rank/(nChunkPerServer+1); 
     2047          } 
     2048          else 
     2049          { 
     2050            // nServerWithAdditionalChunk servers have been affected above with (nChunkPerServer+1) chunks 
     2051            // the rest will recv nChunkPerServer 
     2052            serverRank = nServerWithAdditionalChunk+(rank-nServerWithAdditionalChunk*(nChunkPerServer+1))/nChunkPerServer; 
     2053          } 
     2054        } 
     2055        else // (nbServer > nbClient) 
     2056        { 
     2057          serverRank = rank; 
     2058        } 
     2059        auto& globalInd =  globalIndex[serverRank] ; 
    20202060        globalInd.resize(indSize) ; 
    20212061        for(size_t n = 0 ; n<indSize; n++) globalInd(n)=indStart+n ; 
Note: See TracChangeset for help on using the changeset viewer.