| 301 | } |
| 302 | |
| 303 | void Network::ReduceScatterRing(char* input, comm_size_t, int type_size, |
| 304 | const comm_size_t* block_start, const comm_size_t* block_len, char* output, |
| 305 | comm_size_t, const ReduceFunction& reducer) { |
| 306 | const int out_rank = (rank_ + 1) % num_machines_; |
| 307 | const int in_rank = (rank_ - 1 + num_machines_) % num_machines_; |
| 308 | int out_block = in_rank; |
| 309 | int in_block = (in_rank - 1 + num_machines_) % num_machines_; |
| 310 | for (int i = 1; i < num_machines_; ++i) { |
| 311 | linkers_->SendRecv(out_rank, input + block_start[out_block], block_len[out_block], |
| 312 | in_rank, output, block_len[in_block]); |
| 313 | reducer(output, input + block_start[in_block], type_size, block_len[in_block]); |
| 314 | out_block = (out_block - 1 + num_machines_) % num_machines_; |
| 315 | in_block = (in_block - 1 + num_machines_) % num_machines_; |
| 316 | } |
| 317 | std::memcpy(output, input + block_start[rank_], block_len[rank_]); |
| 318 | } |
| 319 | |
| 320 | } // namespace LightGBM |