vec_conv
功能说明
根据src与dst tensor的类型进行精度转换。
函数原型
vec_conv(mask, round_mode, dst, src, repeat_times, dst_rep_stride, src_rep_stride, deqscale=None, ldst_high_half=False)
参数说明
参数名称 |
输入/输出 |
含义 |
---|---|---|
mask |
输入 |
请参考表1中mask参数描述。 |
round_mode |
输入 |
在转换过程中,最后一位转换处理模式,支持以下字符串配置:
|
dst |
输出 |
目的操作数。 |
src |
输入 |
源操作数。 |
repeat_times |
输入 |
重复迭代次数。 |
dst_rep_stride |
输入 |
相邻迭代间,目的操作数相同block地址步长。 |
src_rep_stride |
输入 |
相邻迭代间,源操作数相同block地址步长。 |
deqscale |
输入 |
量化scale,辅助转换参数,默认值为None。 支持的数据类型为:Scalar(float16)、立即数(float)。 |
ldst_high_half |
输入 |
指定dst_list/src_list是存储/来自每个block的高半部或者低半部,默认值为False。 支持bool类型,True/Flase表示高半部/低半部; 注:该参数对于不同组合会分别表现为不同的功能定义,分别表示dst_list/src_list的存储/读取。 昇腾310 AI处理器,不支持该参数。 |
src.dtype |
dst.dtype |
round_mode supported |
deqscale |
---|---|---|---|
float16 |
int32 |
'round', 'floor', 'ceil', 'ceiling' |
None |
float16 |
float32 |
'', 'none' |
None |
float32 |
float16 |
'', 'none' |
None |
float16 |
int8 |
'', 'none' |
None |
float16 |
uint8 |
'', 'none' |
None |
int32 |
float16 |
'', 'none' |
Scalar(float16)/立即数(float) |
uint8 |
float16 |
'', 'none' |
None |
int8 |
float16 |
'', 'none' |
None |
返回值
无
注意事项
- repeat_times∈[0,255]。支持的数据类型为:Scalar(int16/int32/int64/uint16/uint32/uint64)、立即数(int)、Expr(int16/int32/int64/uint16/uint32/uint64)。当repeat_times为立即数时,不支持0。
- 每个repeat的并行度取决于数据精度、芯片版本,如f32->f16转换每次迭代操作64个源/目的element。
- 指令dst_rep_stride/src_rep_stride
;单位为32B,支持的数据类型为:Scalar(int16/int32/int64/uint16/uint32/uint64)、立即数(int)、Expr(int16/int32/int64/uint16/uint32/uint64)。
- dst/src所支持的数据类型与芯片版本有关,如果不支持,工具会报错。
- dst与src的应为不同tensor,或同一tensor的同一element,不支持同一tensor的不同element。
- 为了节省地址空间,开发者可以定义一个Tensor,供源操作数与目的操作数同时使用(即地址重叠),相关约束如下:
- 对于单次repeat(repeat_times=1),且源操作数与目的操作数之间要求100%完全重叠,不支持部分重叠。
- 对于多次repeat(repeat_times>1),若源操作数与目的操作数之间存在依赖,即第N次迭代的目的操作数是第N+1次的源操作数,这种情况是不支持地址重叠的。
- 操作数地址偏移对齐要求请见通用约束。
调用示例
from te import tik tik_instance = tik.Tik() src_ub = tik_instance.Tensor("float16", (128,), name="src_ub", scope=tik.scope_ubuf) dst_ub = tik_instance.Tensor("int32", (128,), name="dst_ub", scope=tik.scope_ubuf) tik_instance.vec_conv(64, "round", dst_ub, src_ub, 2, 8, 4)
