ceil_div

产品支持情况

  • Ascend 950PR/Ascend 950DT:支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持
  • Atlas 200I/500 A2 推理产品:不支持
  • Atlas 推理系列产品 AI Core:不支持
  • Atlas 推理系列产品 Vector Core:不支持
  • Atlas 训练系列产品:不支持

功能说明

头文件路径为:"utils/std/cmath.h"

计算两个整数a和b相除后向上取整的结果。该接口可在Host侧和AI Core侧使用。

函数原型

template <typename T, typename U>
__host__ __aicore__ inline constexpr auto ceil_div(const T& a, const U& b);

参数说明

表 1 模板参数说明

参数名 含义
T 参数a的数据类型,必须为整型。
U 参数b的数据类型,必须为整型。

表 2 接口参数说明

参数名 输入/输出 描述
a 输入 被除数。
b 输入 除数。

返回值说明

返回两个整型数相除的向上取整结果。一般情况下,返回值类型由decltype(T{} / U{})推导得到。

约束说明

  • T和U必须为整型,支持的数据类型:int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t。
  • 当b为0时,结果为0。
  • 对于有符号输入,调用方需确保a >= 0且b > 0。
  • 针对Ascend 950PR/Ascend 950DT,vector侧使用时,该接口入参仅支持uint32_t类型,VF场景下返回值仅支持uint16_t类型,调用方需使用static_cast转换并确保向上取整结果在uint16_t可表示范围内;该约束源于VF Hardware Loop编码规范,更多规范内容可参考《Hardware Loop编码规范》

调用示例

本示例中使用ceil_div计算迭代次数repeatTime,通过对数据量count与单次处理数据量进行向上取整除法,确保所有数据(包括尾块)均被完整处理。

template <typename T>
__simd_vf__ inline void AddCustom(__local_mem__ T *dst, __local_mem__ T *src0, __local_mem__ T *src1,
    uint32_t count)
{
    AscendC::Reg::RegTensor<T> srcReg0;
    AscendC::Reg::RegTensor<T> srcReg1;
    AscendC::Reg::RegTensor<T> dstReg;
    AscendC::Reg::MaskReg mask;
    constexpr uint32_t oneRepeatSize = AscendC::GetVecLen() / sizeof(T);
    uint16_t repeatTime = static_cast<uint16_t>(AscendC::Std::ceil_div(count, oneRepeatSize));
    for (uint16_t i = 0; i < repeatTime; ++i) {
        mask = AscendC::Reg::UpdateMask<T>(count);
        AscendC::Reg::LoadAlign(srcReg0, src0 + i * oneRepeatSize);
        AscendC::Reg::LoadAlign(srcReg1, src1 + i * oneRepeatSize);
        AscendC::Reg::Add(dstReg, srcReg0, srcReg1, mask);
        AscendC::Reg::StoreAlign(dst + i * oneRepeatSize, dstReg, mask);
    }
}