void getDistributionMap()

in gloo/reduce_scatter.h [73:107]


  void getDistributionMap(
      size_t srcOffset, size_t srcCount, const std::vector<int>& recvCounts,
      bool reorder, std::vector<DistributionMap>& distributionMap) {
    if (srcCount == 0) {
      return;
    }

    size_t destOffset = 0;
    auto size =
        reorder ? 1 << (int)log2(this->contextSize_) : this->contextSize_;
    int start = 0;
    for (; start < size; ++start) {
      if (destOffset + recvCounts[start] > srcOffset) break;
      destOffset += recvCounts[start];
    }
    destOffset = srcOffset - destOffset;

    auto totalCount = srcCount;
    for (int i = start; i < size; ++i) {
      auto recvCount = recvCounts[i];
      if (destOffset != 0) {
        recvCount -= destOffset;
        destOffset = 0;
      }
      auto rank =
          reorder ? reverseLastNBits(i, log2(this->contextSize_)) : i;
      recvCount = recvCount < totalCount ? recvCount : totalCount;
      distributionMap.emplace_back(rank, srcOffset, recvCount);
      srcOffset += recvCount;
      totalCount -= recvCount;
      if (totalCount <= 0) {
        break;
      }
    }
  }