Skip to content

Axpy

产品支持情况

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

功能说明

头文件路径为:"basic_api/kernel_operator_vec_ternary_scalar_intf.h"

向量和标量的乘积,并将乘积结果逐元素加到的输出向量上。计算公式如下:

函数原型

  • tensor前n个数据连续计算

    C++
    template <typename T, typename U>
    __aicore__ inline void Axpy(const LocalTensor<T>& dst, const LocalTensor<U>& src, const U& scalarValue, const int32_t& count)
    
  • tensor高维切分计算

    • mask逐bit模式

      C++
      template <typename T, typename U, bool isSetMask = true>
      __aicore__ inline void Axpy(const LocalTensor<T>& dst, const LocalTensor<U>& src, const U& scalarValue, uint64_t mask[], const uint8_t repeatTime, const UnaryRepeatParams& repeatParams)
      
    • mask连续模式

      C++
      template <typename T, typename U, bool isSetMask = true>
      __aicore__ inline void Axpy(const LocalTensor<T>& dst, const LocalTensor<U>& src, const U& scalarValue, uint64_t mask, const uint8_t repeatTime, const UnaryRepeatParams& repeatParams)
      

参数说明

模板参数说明

参数名描述
T目的操作数数据类型。
U源操作数数据类型。
isSetMask是否在接口内部设置mask。
• true,表示在接口内部设置mask。
• false,表示在接口外部设置mask,开发者需要使用SetVectorMask接口设置mask值。这种模式下,接口入参中的mask值设置为占位符MASK_PLACEHOLDER,用于占位,无实际含义。

参数说明

参数名称输入/输出说明
dst输出目的操作数。
类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。
src输入源操作数。
类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。
scalarValue输入源操作数,scalar标量。scalarValue的数据类型需要和src保持一致。
count输入参与计算的元素个数。关于该参数的具体说明请参考连续计算
mask/mask[]输入mask用于控制每次迭代内参与计算的元素。
设置详见掩码操作
repeatTime输入重复迭代次数。
矢量计算单元,每次读取连续的256字节数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。
关于该参数的具体描述请参考高维切分API
repeatParams输入控制操作数地址步长的参数。UnaryRepeatParams类型,包含操作数相邻迭代间相同DataBlock的地址步长,操作数同一迭代内不同DataBlock的地址步长等参数。
相邻迭代间的地址步长参数说明请参考repeatStride;同一迭代内DataBlock的地址步长参数说明请参考dataBlockStride

数据类型

PAR列表示矢量计算单元一个迭代能够处理的元素个数。

Ascend 950PR/Ascend 950DT支持的数据类型组合情况

src数据类型scalarValue数据类型dst数据类型PAR
halfhalfhalf128
floatfloatfloat64
halfhalffloat64
int64_tint64_tint64_t64
uint64_tuint64_tuint64_t64
bfloat16_tbfloat16_tbfloat16_t128

针对Ascend 950PR/Ascend 950DT,int64_t、uint64_t数据类型仅支持tensor前n个数据计算接口。

Atlas A3 训练系列产品/Atlas A3 推理系列产品支持的数据类型组合情况

src数据类型scalarValue数据类型dst数据类型PAR
halfhalfhalf128
floatfloatfloat64
halfhalffloat64

Atlas A2 训练系列产品/Atlas A2 推理系列产品支持的数据类型组合情况

src数据类型scalarValue数据类型dst数据类型PAR
halfhalfhalf128
floatfloatfloat64
halfhalffloat64

Atlas 200I/500 A2 推理产品支持的数据类型组合情况

src数据类型scalarValue数据类型dst数据类型PAR
halfhalfhalf128
floatfloatfloat64
halfhalffloat64

Atlas 推理系列产品AI Core支持的数据类型组合情况

src数据类型scalarValue数据类型dst数据类型PAR
halfhalfhalf128
floatfloatfloat64
halfhalffloat64

Atlas 训练系列产品支持的数据类型组合情况

src数据类型scalarValue数据类型dst数据类型PAR
halfhalfhalf128
floatfloatfloat64
halfhalffloat64

Kirin X90支持的数据类型组合情况

src数据类型scalarValue数据类型dst数据类型PAR
halfhalfhalf128
floatfloatfloat64
halfhalffloat64

Kirin 9030支持的数据类型组合情况

src数据类型scalarValue数据类型dst数据类型PAR
halfhalfhalf128
floatfloatfloat64
halfhalffloat64

返回值说明

约束说明

  • 操作数地址对齐要求请参见通用地址对齐约束
  • 操作数地址重叠约束请参考通用地址重叠约束
  • 源操作数的数据类型为half、目的操作数的数据类型为float的情况下,不支持地址重叠。
  • 使用tensor高维切分计算接口时,src和scalarValue的数据类型为half、dst的数据类型为float的情况下,一个迭代处理内最多处理64个输入数据。
  • 当参数count或repeatTime取值为0时,该接口的行为如下:
    • 针对如下型号,该接口不会执行计算操作,不会对目的操作数进行写入,该接口将被视为NOP(空操作)。
      • Atlas A3 训练系列产品/Atlas A3 推理系列产品
      • Atlas A2 训练系列产品/Atlas A2 推理系列产品
    • 针对Ascend 950PR/Ascend 950DT,该接口通过VF调用Reg矢量计算API实现兼容,当参数count或repeatTime取值为0时,不保证该接口将被视为NOP(空操作)。
  • 对UB空间的占用说明。针对Ascend 950PR/Ascend 950DT:
    • tensor高维切分计算接口占用8KB Unified Buffer临时空间。
    • tensor前n个数据连续计算接口不涉及8KB Unified Buffer临时空间的占用。

调用示例

本样中只展示部分关键代码。如果您需要运行样例代码,请参考完整样例复合计算样例

  • tensor高维切分计算样例-mask连续模式。

    C++
    // repeatTime = 4, mask = 128, 128 elements one repeat, 512 elements total
    // srcLocal数据类型为half,scalarValue数据类型为half,dstLocal数据类型为half
    // dstBlkStride, srcBlkStride = 1, no gap between blocks in one repeat
    // dstRepStride, srcRepStride = 8, no gap between repeats 
    AscendC::Axpy(dstLocal, srcLocal, (half)2.0, 128, 4,{ 1, 1, 8, 8 });
    
    // srcLocal数据类型为half,scalarValue数据类型为half,dstLocal数据类型为float
    // repeatTime = 8, mask = 64, 64 elements one repeat, 512 elements total
    // dstBlkStride, srcBlkStride = 1, no gap between blocks in one repeat
    // dstRepStride = 8, srcRepStride = 4, no gap between repeats 
    AscendC::Axpy(dstLocal, srcLocal, (half)2.0, 64, 8,{ 1, 1, 8, 4 }); // 每次迭代选取源操作数前4个datablock参与计算
    
  • tensor高维切分计算样例-mask逐bit模式。

    C++
    uint64_t mask[2] = { 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF };
    // repeatTime = 4, 128 elements one repeat, 512 elements total, half精度组合
    // dstBlkStride, srcBlkStride = 1, no gap between blocks in one repeat
    // dstRepStride, srcRepStride = 8, no gap between repeats
    AscendC::Axpy(dstLocal, srcLocal, (half)2.0, mask, 4,{ 1, 1, 8, 8 });
    
  • tensor前n个数据计算样例。

    C++
    AscendC::Axpy(dstLocal, src0Local, (half)2.0, 512);// half精度组合
    

结果示例如下:

输入数据(src0Local):
[1. 2. 3. 4. 5. 6. ... 512.]
输入数据(scalarValue):2.0
输出数据(dstLocal)初始值:
[0. 0. 0. 0. 0. 0. ... 0.]
进行Axpy计算后,输出数据(dstLocal):
[2. 4. 6. 8. 10. 12. ... 1024.]

免责声明:本站内容由 asc-devkit 仓 master 分支自动编译生成,属于持续开发版本,可能存在缺陷,仅供预览与参考。如需稳定及商用资料,请查阅官方 昇腾社区