vec_reduce_min
函数原型
vec_reduce_min(mask, dst, src, work_tensor, repeat_times, src_rep_stride, cal_index=False)
参数说明
参数名称 |
输入/输出 |
含义 |
---|---|---|
mask |
输入 |
请参考表1中mask参数描述。 |
dst |
输入 |
目的操作数,tensor起始element,起始地址要求4Byte对齐。 Tensor的scope为Unified Buffer。 |
src |
输入 |
源操作数,tensor起始element,起始地址对齐要求请见通用约束。 Tensor的scope为Unified Buffer。 |
work_tensor |
输入 |
指令执行期间存储中间结果,用于内部计算所需操作空间,需特别注意空间大小,参见各指令注意事项。 |
repeat_times |
输入 |
重复迭代次数。Scalar(int32)、立即数(int)、Expr(int32)。建议采用立即数,性能比scalar和表达式高。 |
src_rep_stride |
输入 |
相邻迭代间,源操作数相同block地址步长。支持的数据类型为:Scalar(int16/int32/int64/uint16/uint32/uint64)、立即数(int)、Expr(int16/int32/int64/uint16/uint32/uint64)。 |
cal_index |
输入 |
指定是否获取最值的索引(仅vec_reduce_max/vec_reduce_min支持),仅支持bool类型,默认值为False,取值:
|
dst、src和work_tensor的数据类型需保持一致。
Atlas 200/300/500 推理产品,dst、src和work_tensor支持的数据类型为:Tensor(float16)
Atlas 训练系列产品,dst、src和work_tensor支持的数据类型为:Tensor(float16)
Atlas推理系列产品(Ascend 310P处理器)AI Core,dst、src和work_tensor支持的数据类型为:Tensor(float16/float32)
Atlas推理系列产品(Ascend 310P处理器)Vector Core,dst、src和work_tensor支持的数据类型为:Tensor(float16/float32/int16)
Atlas A2训练系列产品/Atlas 800I A2推理产品,dst、src和work_tensor支持的数据类型为:Tensor(float16/float32)
Atlas 200/500 A2推理产品,dst、src和work_tensor支持的数据类型为:Tensor(float16/float32)。
返回值
无
支持的型号
Atlas 200/300/500 推理产品
Atlas 训练系列产品
Atlas推理系列产品(Ascend 310P处理器)AI Core
Atlas推理系列产品(Ascend 310P处理器)Vector Core
Atlas A2训练系列产品/Atlas 800I A2推理产品
Atlas 200/500 A2推理产品
注意事项
- repeat_times支持的数据类型为:Scalar(int32)、立即数(int)、Expr(int32)。
- 当cal_index=False时,repeat_times[1,4095]
- 当cal_index=True时:
Atlas 200/300/500 推理产品,repeat_times[1,511],由于index最大支持数值为float16最大表示数值65504,因此最多支持511次迭代。
Atlas 训练系列产品,repeat_times[1,511],由于index最大支持数值为float16最大表示数值65504,因此最多支持511次迭代。
Atlas推理系列产品(Ascend 310P处理器)AI Core,当操作数数据类型为float16,repeat_times[1,511],由于index最大支持数值为float16最大表示数值65504,因此最多支持511次迭代。当操作数数据类型为float32时,repeat_times[1,4095]。
Atlas推理系列产品(Ascend 310P处理器)Vector Core,当操作数数据类型为float16,repeat_times[1,511],由于index最大支持数值为float16最大表示数值65504,因此最多支持511次迭代。当操作数数据类型为float32时,repeat_times[1,4095]。当操作数数据类型为int16时,repeat_times[1,255],由于index最大支持数值为int16最大表示数值32767,因此最多支持255次迭代。
Atlas A2训练系列产品/Atlas 800I A2推理产品,当操作数数据类型为float16,repeat_times[1,511],由于index最大支持数值为float16最大表示数值65504,因此最多支持511次迭代。当操作数数据类型为float32时,repeat_times[1,4095]。
Atlas 200/500 A2推理产品,当操作数数据类型为float16,repeat_times[1,511],由于index最大支持数值为float16最大表示数值65504,因此最多支持511次迭代。当操作数数据类型为float32时,repeat_times[1,4095]。
- src_rep_stride[0,65535],支持的数据类型为:Scalar(int16/int32/int64/uint16/uint32/uint64)、立即数(int)、Expr(int16/int32/int64/uint16/uint32/uint64)。
- dst结果存储顺序为最值,最值索引。返回结果中索引index数据实际上是按照相应整数类型进行存储的,如dst定义为float16时,index为uint16类型,但按照float16格式进行读取,因此注意index使用时需要使用reinterpret_cast_to()方法转换到相应整数类型。
- work_tensor空间限制如下:
- 当cal_index=False时,至少需要repeat_times*2个elements。例如当repeat_times=120时,work_tensor的shape至少为240。
- 当cal_index=True时,需要使用公式计算空间大小,公式如下。
# DTYPE_SIZE指数据类型所占的空间,以Byte为单位,如float16类型占2Bytes。elements_per_block指每个block所需的element个数 elements_per_block = block_size // DTYPE_SIZE[dtype] elements_per_repeat = block_size * 8 // DTYPE_SIZE[dtype] # elements_per_repeat指每个repeat所需的element个数 it1_output_count = 2*repeat_times # 第一轮操作产生的元素个数 def ceil_div(a_value, b_value): return (a_value + b_value - 1) // b_value it2_align_start = ceil_div(it1_output_count, elements_per_block)*elements_per_block # 第二轮操作起始位置偏移,ceil_div功能为相除之后向上取整 it2_output_count = ceil_div(it1_output_count, elements_per_repeat)*2 # 第二轮操作产生的元素个数 it3_align_start = ceil_div(it2_output_count, elements_per_block)*elements_per_block # 第三轮操作起始位置偏移 it3_output_count = ceil_div(it2_output_count, elements_per_repeat)*2 # 第三轮操作产生的元素个数 it4_align_start = ceil_div(it3_output_count, elements_per_block)*elements_per_block # 第四轮操作起始位置偏移 it4_output_count = ceil_div(it3_output_count, elements_per_repeat)*2 # 第四轮操作产生的元素个数 final_work_tensor_need_size = it2_align_start + it3_align_start + it4_align_start + it4_output_count # 最终所需的work_tensor大小
- dst和work_tensor之间不能存在地址重叠。
调用示例
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", (16,), 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", (16,), name="dst_ub", scope=tik.scope_ubuf) work_tensor_ub = tik_instance.Tensor("float16", (18,), tik.scope_ubuf, "work_tensor_ub") # 将用户输入数据从gm搬运到ub tik_instance.data_move(src_ub, src_gm, 0, 1, 16, 0, 0) # 给dst_ub赋初始值0,这样输出结果更加直观 tik_instance.vec_dup(16, dst_ub, 0, 1, 1) tik_instance.vec_reduce_min(128, dst_ub, src_ub, work_tensor_ub, 2, 8, cal_index=True) # 将计算结果从ub搬运到gm tik_instance.data_move(dst_gm, dst_ub, 0, 1, 1, 0, 0) tik_instance.BuildCCE(kernel_name="vec_reduce_min", inputs=[src_gm], outputs=[dst_gm])
结果示例:
输入数据(src_gm): [ 6.344 1.954 -3.246 9.555 9.29 -6.95 7.586 5.67 3.2 -3.234 0.4087 -5.777 -7.156 -4.71 -1.587 4.023 2.242 3.72 3.064 6.21 -1.627 -5.69 1.263 -0.577 0.1646 1.894 -9.945 -7.18 3.72 1.8955 -9.53 -0.0693 -4.836 9.13 1.122 4.766 -7.957 -5.07 -6.93 9.47 2.912 5.938 -2.617 -9.97 3.99 2.805 1.9375 9.04 0.03117 0.6147 -2.37 -6.297 -4.715 -5.89 3.137 -0.976 5.79 0.02997 -2.07 -9.17 -1.8 3.498 -9.266 4.562 7.023 -8.78 -1.974 7.508 -2.205 2.162 -2.775 4.1 6.633 -8.1 3.334 -4.52 6.26 -5.516 -7.223 -8.586 5. -3.787 3.836 -1.833 -1.063 -6.188 -8.36 -5.91 6.812 6.137 -7.746 9.2 -5.492 2.799 -7.613 9.695 -4.074 3.188 7.145 -7.477 -7.01 6.137 -4.77 8.42 4.336 9.836 -6.86 3.363 1.32 -4.36 2.629 -3.09 9.53 -9.24 8.99 3.355 9.77 1.465 2.826 9.82 8.94 1.122 9.516 -2.146 -4.566 -4.414 -1.057 -7.97 0.4263 0.171 -4.254 1.046 -3.191 9.36 3.287 -0.6216 -4.957 -3.605 -9.35 -6.863 1.472 5.06 -9.75 -9.54 -3.707 6.92 5.88 -4.855 -8.21 2.697 8.17 7.836 6.008 -4.402 -1.721 6.39 -3.992 -5.33 6.56 -9.305 0.7114 -5.58 8.93 -1.598 -8.164 -5.805 0.4302 -8.766 -9.414 8.81 4.6 -9.83 6.5 7.38 -0.9526 8.04 5.008 4.863 -8.36 0.4224 8.68 -8.484 -0.9536 8.164 0.8613 -4.027 -4.848 -2.875 6.67 -7.75 -6.133 0.08655 -9.96 7.266 6.082 5.883 -8.32 -8.87 -8.945 4.363 -1.022 -8.57 6.66 -2.553 0.0873 8.89 -4.336 5.01 8.24 -2.953 3.93 9.695 6.227 8.625 -7.926 9.51 6.27 -3.28 0.911 -7.938 -7.48 -9.94 7.57 -9.62 3.654 -5.867 4.45 4.492 -3.129 4.523 1.69 3.947 0.9663 -9.766 9.48 -4.652 -1.876 -2.516 2.34 7.16 5.223 5.473 1.373 1.489 1.538 -0.3293 -8.61 1.894 -2.56 -2.379 8.48 -4.81 -0.877 -7.85 -2.148 1.938 ] 输出数据(dst_gm): [-9.97e+00 2.56e-06 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00]
更多示例请参考vec_reduce_max。