in fairring/utils.h [277:316]
inline Layout computeLayout(
int64_t maxMemoryAllocatedInBytes,
int64_t maxPaddingAllocatedInBytes,
int64_t minParallelism,
int64_t numMachines,
int64_t numDevicesPerMachine) {
int64_t onePaddingSizeInBytes =
numDevicesPerMachine * numMachines * kAlignment;
int64_t numPaddingSlots = maxPaddingAllocatedInBytes / onePaddingSizeInBytes;
MY_CHECK(minParallelism <= numPaddingSlots);
int64_t sliceSizeInBytes = std::numeric_limits<int64_t>::max();
int64_t slotSizeInBytes = 0;
int64_t numStagingSlots = 0;
if (numDevicesPerMachine == 1) {
int64_t paddingMemoryInBytes =
2 * minParallelism * numDevicesPerMachine * numMachines * kAlignment;
MY_CHECK(paddingMemoryInBytes <= maxMemoryAllocatedInBytes);
slotSizeInBytes = roundDownToNearestMultiple(
(maxMemoryAllocatedInBytes - paddingMemoryInBytes) / minParallelism,
numDevicesPerMachine * numMachines * kAlignment);
sliceSizeInBytes = slotSizeInBytes * numDevicesPerMachine;
numStagingSlots = minParallelism;
numPaddingSlots = minParallelism;
}
LOG(WARNING) << "The Fairring process group will achieve a parallelism of "
<< numPaddingSlots << (numStagingSlots == 0 ? "+" : "")
<< " and its slice size is "
<< (sliceSizeInBytes == std::numeric_limits<int64_t>::max()
? "infinite"
: std::to_string(sliceSizeInBytes));
return Layout{
.slotSizeInBytes = slotSizeInBytes,
.sliceSizeInBytes = sliceSizeInBytes,
.numPaddingSlots = numPaddingSlots,
.numStagingSlots = numStagingSlots,
};
}