Changeset 2390
- Timestamp:
- 07/29/22 13:51:58 (23 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS3/trunk/src/node/domain.cpp
r2389 r2390 1994 1994 int nbClient = client->getIntraCommSize() ; 1995 1995 int rankClient = client->getIntraCommRank() ; 1996 int size = nbServer / nbClient ; 1996 1997 int nbChunk = max( nbServer, nbClient); 1998 int size ;//= nbChunk / nbClient ; 1997 1999 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 } 2004 2022 2005 2023 for(int i=0; i<size; i++) 2006 2024 { 2007 2025 int rank=start+i ; 2008 size_t indSize = nj_glo/nb Server;2026 size_t indSize = nj_glo/nbChunk ; 2009 2027 size_t indStart ; 2010 if (nj_glo % nb Server> rank)2028 if (nj_glo % nbChunk > rank) 2011 2029 { 2012 2030 indStart = (indSize+1) * rank ; 2013 2031 indSize++ ; 2014 2032 } 2015 else indStart = indSize*rank + nj_glo%nb Server;2033 else indStart = indSize*rank + nj_glo%nbChunk ; 2016 2034 2017 2035 indStart=indStart*ni_glo ; 2018 2036 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] ; 2020 2060 globalInd.resize(indSize) ; 2021 2061 for(size_t n = 0 ; n<indSize; n++) globalInd(n)=indStart+n ;
Note: See TracChangeset
for help on using the changeset viewer.