"python-package/vscode:/vscode.git/clone" did not exist on "163416d2f56b6fe31e72138b8046b9e018c5e27c"
linker_topo.cpp 3.13 KB
Newer Older
Guolin Ke's avatar
Guolin Ke committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <LightGBM/network.h>

#include <LightGBM/utils/common.h>
#include <LightGBM/utils/log.h>

#include <string>
#include <vector>
#include <unordered_map>

namespace LightGBM {


BruckMap::BruckMap() {
  k = 0;
}

BruckMap::BruckMap(int n) {
  k = n;
  // default set to -1
  for (int i = 0; i < n; ++i) {
    in_ranks.push_back(-1);
    out_ranks.push_back(-1);
  }
}

BruckMap BruckMap::Construct(int rank, int num_machines) {
  // distance at k-th communication, distance[k] = 2^k
  std::vector<int> distance;
  int k = 0;
Guolin Ke's avatar
Guolin Ke committed
30
  for (k = 0; (1 << k) < num_machines; ++k) {
Guolin Ke's avatar
Guolin Ke committed
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    distance.push_back(1 << k);
  }
  BruckMap bruckMap(k);
  for (int j = 0; j < k; ++j) {
    // set incoming rank at k-th commuication
    const int in_rank = (rank + distance[j]) % num_machines;
    bruckMap.in_ranks[j] = in_rank;
    // set outgoing rank at k-th commuication
    const int out_rank = (rank - distance[j] + num_machines) % num_machines;
    bruckMap.out_ranks[j] = out_rank;
  }
  return bruckMap;
}

RecursiveHalvingMap::RecursiveHalvingMap() {
  k = 0;
47
48
  is_prof2 = true;
  num_remain = 0;
Guolin Ke's avatar
Guolin Ke committed
49
}
Guolin Ke's avatar
Guolin Ke committed
50

51
RecursiveHalvingMap::RecursiveHalvingMap(int in_k, int in_remain, int in_rank, bool is_power_of2) {
Guolin Ke's avatar
Guolin Ke committed
52
  k = in_k;
53
54
55
56
57
58
59
60
61
62
  is_prof2 = is_power_of2;
  num_remain = in_remain;
  virtual_rank = in_rank;
  for (int i = 0; i < k; ++i) {
    // defalut set as -1
    ranks.push_back(-1);
    send_block_start.push_back(-1);
    send_block_len.push_back(-1);
    recv_block_start.push_back(-1);
    recv_block_len.push_back(-1);
Guolin Ke's avatar
Guolin Ke committed
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  }
}

RecursiveHalvingMap RecursiveHalvingMap::Construct(int rank, int num_machines) {
  // construct all recursive halving map for all machines
  int k = 0;
  while ((1 << k) <= num_machines) { ++k; }
  // let 1 << k <= num_machines
  --k;
  // distance of each communication
  std::vector<int> distance;
  for (int i = 0; i < k; ++i) {
    distance.push_back(1 << (k - 1 - i));
  }

78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  int remain = num_machines - (1 << k);
  int virtual_rank = rank;
  // if virtual_rank not -1 will not excute recursize halving algorithm
  if (rank < 2 * remain) {
    if (rank % 2 == 0) {
      virtual_rank = -1;
    } else {
      virtual_rank = rank / 2;
    }
  } else {
    virtual_rank = rank - remain;
  }

  bool is_power_of2 = false;
  if ((1 << k) == num_machines) { is_power_of2 = true; }
  RecursiveHalvingMap rec_map(k, remain, virtual_rank, is_power_of2);
  if (virtual_rank != -1) {
Guolin Ke's avatar
Guolin Ke committed
95
96
    for (int i = 0; i < k; ++i) {
      // communication direction, %2 == 0 is positive
97
      const int dir = ((virtual_rank / distance[i]) % 2 == 0) ? 1 : -1;
Guolin Ke's avatar
Guolin Ke committed
98
      // neighbor at k-th communication
99
      const int next_node_idx = virtual_rank + dir * distance[i];
Guolin Ke's avatar
Guolin Ke committed
100
101
      rec_map.ranks[i] = next_node_idx;
      // receive data block at k-th communication
102
      const int recv_block_start = virtual_rank / distance[i];
Guolin Ke's avatar
Guolin Ke committed
103
104
105
106
107
108
109
110
      rec_map.recv_block_start[i] = recv_block_start * distance[i];
      rec_map.recv_block_len[i] = distance[i];
      // send data block at k-th communication
      const int send_block_start = next_node_idx / distance[i];
      rec_map.send_block_start[i] = send_block_start * distance[i];
      rec_map.send_block_len[i] = distance[i];
    }
  }
111
  return rec_map;
Guolin Ke's avatar
Guolin Ke committed
112
113
114
115
}

}  // namespace LightGBM