inline Layout computeLayout()

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