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;
}
}
}