vec_reduce_add

功能说明

对所有输入数据求和。

数据采用二叉树方式,两两相加。

假设源操作数为256个float16的数据[data0,data1,data2...data255],两个repeat可以计算完,计算过程如下。

  1. [data0,data1,data2...data127]为第一个repeat的源操作数,计算得到result01,具体计算方式为:
    1. data0和data1相加得到data00,data2和data3相加得到data01,...,data124和data125相加得到data62,data126和data127相加得到data63。
    2. data00和data01相加得到data000,data02和data03相加得到data001,...,data62和data63相加得到data031。
    3. 以此类推,计算得到result01。
  2. [data128,data1,data2...data255]为第二个repeat的源操作数,计算得到result02;
  3. 将result01与result02相加,得到目的操作数为1个float16的数据[data]。

函数原型

vec_reduce_add(mask, dst, src, work_tensor, repeat_times, src_rep_stride)

参数说明

参数名称

输入/输出

含义

mask

输入

请参考表1中mask参数描述。

dst

输出

目的操作数,tensor起始element。

Tensor的scope为Unified Buffer

src

输入

源操作数,tensor起始element。

Tensor的scope为Unified Buffer

work_tensor

输入

指令执行期间存储中间结果,用于内部计算所需操作空间,需特别注意空间大小,参见各指令注意事项。

repeat_times

输入

重复迭代次数。

src_rep_stride

输入

相邻迭代间,源操作数相同block地址步长。

dst、src和work_tensor的数据类型需保持一致。

Atlas 200/300/500 推理产品,dst、src和work_tensor支持的数据类型为:Tensor(float16/float32)

Atlas 训练系列产品,dst、src和work_tensor支持的数据类型为:Tensor(float16/float32)

返回值

支持的芯片型号

Atlas 200/300/500 推理产品

Atlas 训练系列产品

注意事项

调用示例

from tbe import tik
tik_instance = tik.Tik()
src_gm = tik_instance.Tensor("float16", (256,), name="src_gm", scope=tik.scope_gm)
dst_gm = tik_instance.Tensor("float16", (32,), name="dst_gm", scope=tik.scope_gm)
src_ub = tik_instance.Tensor("float16", (256,), name="src_ub", scope=tik.scope_ubuf)
dst_ub = tik_instance.Tensor("float16", (32,), name="dst_ub", scope=tik.scope_ubuf)
work_tensor_ub = tik_instance.Tensor("float16", (32,), tik.scope_ubuf, "work_tensor_ub")
# 拷贝用户输入数据到src ubuf
tik_instance.data_move(src_ub, src_gm, 0, 1, 16, 0, 0)
# 给dst ubuf赋初始值0,这样输出结果更加直观
tik_instance.vec_dup(32, dst_ub, 0, 1, 1)
tik_instance.vec_reduce_add(128, dst_ub, src_ub, work_tensor_ub, 2, 8)
# 将计算结果拷贝到目标gm
tik_instance.data_move(dst_gm, dst_ub, 0, 1, 2, 0, 0)

tik_instance.BuildCCE(kernel_name="vec_reduce_add", inputs=[src_gm], outputs=[dst_gm])

结果示例如下:

输入:
src_gm=[1,1,1,...,1]
输出结果为:
dst_gm=[256,0,0,...,0]