Component
PTO Dialect / ODS (include/PTO/IR)
Description
A5/VPTO 测试 pto.vmi.vcvt 的 SiToFp(signed-int → fp)场景发现两个问题:
问题①:SiToFp 源必须用 si*,文档只列 i* 未明确
06-convert.md 列的 dtype 集合为 f32/f16/bf16/fp8_e4m3/fp8_e5m2、i32/i16/i8、ui32/ui16/ui8。但 pto.vmi.vcvt 在 int→fp 方向 lower 成 pto.vmi.sitofp 后,该 op 的 verifier 要求源是显式有符号的 si*,不接受 signless i*。
问题②:pto.vmi.sitofp 只接受 32-bit 源
pto.vmi.sitofp 的 verifier 要求源恰好 32-bit(si8/si16 被拒,报 "requires 32-bit integer source element type"),且要求结果恰好 f32(f16/bf16/f8e4m3/f8e5m2 被拒)。即 sitofp 只支持 si32 → f32。
Reproduction (minimal)
关键kernel函数:
@jit_kernel(name, params)
def kernel(src_ptr: pto.ptr(src_ptype, "gm"), out_ptr: pto.ptr(dst_ptype, "gm")):
src_ub = pto.castptr(pto.i64(0), pto.ptr(src_ptype, "ub"))
out_ub = pto.castptr(pto.i64(src_nbytes), pto.ptr(dst_ptype, "ub"))
pto.mte_gm_ub(src_ptr, src_ub, 0, src_nbytes, nburst=(1, 0, 0))
pto.set_flag("MTE2", "V", event_id=0); pto.wait_flag("MTE2", "V", event_id=0)
source = pto.vmi.vload(src_ub, pto.const(0, dtype=pto.index), size=vl)
result = pto.vmi.vcvt(source, to_dtype)
pto.vmi.vstore(result, out_ub, pto.const(0, dtype=pto.index))
pto.set_flag("V", "MTE3", event_id=0); pto.wait_flag("V", "MTE3", event_id=0)
pto.mte_ub_gm(out_ub, out_ptr, dst_nbytes, nburst=(1, 0, 0))
Expected behavior
文档明确 SiToFp 源必须用 si*。
明确 vcvt的sitofp 是否支持非 32-bit 源(si8/si16)
Actual behavior / error logs
问题①(源用 i*):
error: 'pto.vmi.vcvt' op int-to-fp conversion requires explicitly signed integer source element type
note: see current operation: %11 = "pto.vmi.vcvt"(%10) : (!pto.vmi.vreg<8xi32>) -> !pto.vmi.vreg<8xf32>
问题②(源用 si8/si16):
RuntimeError: command failed (1): ptoas --pto-arch=a5 ... kernel.mlir -o kernel.o
loc("kernel.mlir":18:12): error: 'pto.vmi.sitofp' op requires 32-bit integer source element type
Error: VPTO emission pipeline failed.
部分失败用例:
si8_f16_vl8_u_a8_n_r2in(src=si8, dst=f16, vl=8, src_range=-127,128)
si8_f32_vl8_u_a8_n_r2in(src=si8, dst=f32, vl=8, src_range=-127,128)
si16_f16_vl8_u_a8_n_r2in(src=si16, dst=f16, vl=8, src_range=-2048,2049)
si16_f32_vl8_u_a8_n_r2in(src=si16, dst=f32, vl=8, src_range=-32767,32768)
si16_bf16_vl8_u_a8_n_r2in(src=si16, dst=bf16, vl=8, src_range=-256,257)
Git commit
10883a8
Host platform
Linux (aarch64)
Target Ascend arch (if relevant)
a5
PTOAS build level (if relevant)
None
Component
PTO Dialect / ODS (include/PTO/IR)
Description
A5/VPTO 测试 pto.vmi.vcvt 的 SiToFp(signed-int → fp)场景发现两个问题:
问题①:SiToFp 源必须用 si*,文档只列 i* 未明确
06-convert.md 列的 dtype 集合为 f32/f16/bf16/fp8_e4m3/fp8_e5m2、i32/i16/i8、ui32/ui16/ui8。但 pto.vmi.vcvt 在 int→fp 方向 lower 成 pto.vmi.sitofp 后,该 op 的 verifier 要求源是显式有符号的 si*,不接受 signless i*。
问题②:pto.vmi.sitofp 只接受 32-bit 源
pto.vmi.sitofp 的 verifier 要求源恰好 32-bit(si8/si16 被拒,报 "requires 32-bit integer source element type"),且要求结果恰好 f32(f16/bf16/f8e4m3/f8e5m2 被拒)。即 sitofp 只支持 si32 → f32。
Reproduction (minimal)
关键kernel函数: @jit_kernel(name, params) def kernel(src_ptr: pto.ptr(src_ptype, "gm"), out_ptr: pto.ptr(dst_ptype, "gm")): src_ub = pto.castptr(pto.i64(0), pto.ptr(src_ptype, "ub")) out_ub = pto.castptr(pto.i64(src_nbytes), pto.ptr(dst_ptype, "ub")) pto.mte_gm_ub(src_ptr, src_ub, 0, src_nbytes, nburst=(1, 0, 0)) pto.set_flag("MTE2", "V", event_id=0); pto.wait_flag("MTE2", "V", event_id=0) source = pto.vmi.vload(src_ub, pto.const(0, dtype=pto.index), size=vl) result = pto.vmi.vcvt(source, to_dtype) pto.vmi.vstore(result, out_ub, pto.const(0, dtype=pto.index)) pto.set_flag("V", "MTE3", event_id=0); pto.wait_flag("V", "MTE3", event_id=0) pto.mte_ub_gm(out_ub, out_ptr, dst_nbytes, nburst=(1, 0, 0))Expected behavior
文档明确 SiToFp 源必须用 si*。
明确 vcvt的sitofp 是否支持非 32-bit 源(si8/si16)
Actual behavior / error logs
Git commit
10883a8
Host platform
Linux (aarch64)
Target Ascend arch (if relevant)
a5
PTOAS build level (if relevant)
None