source: XIOS3/trunk/src/distribution/leader_process.cpp @ 2396

Last change on this file since 2396 was 2178, checked in by ymipsl, 3 years ago

Externalize in separate file the management of server leader that was in CContextClient. Think later to replace the call in conttexCilent by this new one.

YM

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 2.3 KB
Line 
1#include "leader_process.hpp"
2
3namespace xios
4{
5  void computeLeaderProcess(int clientRank, int clientSize, int serverSize,
6                                       std::list<int>& rankRecvLeader,
7                                       std::list<int>& rankRecvNotLeader)
8    {
9      rankRecvLeader.clear() ;
10      rankRecvNotLeader.clear() ;
11      if ((0 == clientSize) || (0 == serverSize)) return;
12
13      if (clientSize < serverSize)
14      {
15        int serverByClient = serverSize / clientSize;
16        int remain = serverSize % clientSize;
17        int rankStart = serverByClient * clientRank;
18
19        if (clientRank < remain)
20        {
21          serverByClient++;
22          rankStart += clientRank;
23        }
24        else rankStart += remain;
25
26        for (int i = 0; i < serverByClient; i++)
27          rankRecvLeader.push_back(rankStart + i);
28
29        rankRecvNotLeader.resize(0);
30      }
31      else
32      {
33        int clientByServer = clientSize / serverSize;
34        int remain = clientSize % serverSize;
35
36        if (clientRank < (clientByServer + 1) * remain)
37        {
38          if (clientRank % (clientByServer + 1) == 0)
39            rankRecvLeader.push_back(clientRank / (clientByServer + 1));
40          else
41            rankRecvNotLeader.push_back(clientRank / (clientByServer + 1));
42        }
43        else
44        {
45          int rank = clientRank - (clientByServer + 1) * remain;
46          if (rank % clientByServer == 0)
47            rankRecvLeader.push_back(remain + rank / clientByServer);
48          else
49            rankRecvNotLeader.push_back(remain + rank / clientByServer);
50        }
51      }
52    }
53
54  int getLeaderRank(int clientSize, int serverSize, int serverRank)
55  {
56    int rank ;
57    if (clientSize > serverSize)
58    {
59      int serverByClient = clientSize / serverSize;
60      int remain = clientSize % serverSize;
61      rank=0 ;
62      if (remain < serverRank) rank = (serverByClient+1)*remain + serverByClient * (serverRank-remain)  ;   
63      else rank = (serverByClient+1) * serverRank ;
64    }
65    else
66    {
67      int serverByClient = serverSize / clientSize;
68      int remain = serverSize % clientSize;
69     
70      if (remain*(serverByClient+1) > serverRank ) rank = serverRank/(serverByClient+1) ;
71      else 
72      {
73        serverRank = serverRank-(serverByClient+1)*remain ;
74        rank = remain + serverRank/serverByClient ;
75      }
76    }
77    return rank ;
78  }
79}
Note: See TracBrowser for help on using the repository browser.