asc_loadalign_deintlv_postupdate产品支持情况产品是否支持Ascend 950PR/Ascend 950DT支持功能说明asc_loadalign_deintlv_postupdate用于从UB中读取以32B对齐地址src为起始位置的连续2 x VL长度数据。数据按元素类型宽度进行解释在Load过程中完成解交织后分别写入两个目的向量寄存器dst0和dst1。与asc_loadalign_deintlv不同该接口在完成数据加载后会对源地址参数src执行后更新操作src src offset其中offset的单位为元素个数实际地址偏移字节数为offset * sizeof(data_type)。以float数据类型、Ascend 950PR/Ascend 950DT产品为例若VL 256B、src 32、offset 128调用asc_loadalign_deintlv_postupdate后数据从UB到Reg的排布如下图所示同时src会更新为544可直接用于后续计算。提示使用本接口需要包含头文件reg_load.h。本接口会修改输入的UB地址参数src。若需要保留原始地址请使用asc_loadalign_deintlv。函数原型支持的数据类型请参见数据类型章节。__simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_int4x2_t dst0, vector_int4x2_t dst1, __ubuf__ int4b_t* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_fp4x2_e2m1_t dst0, vector_fp4x2_e2m1_t dst1, __ubuf__ fp4x2_e2m1_t* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_fp4x2_e1m2_t dst0, vector_fp4x2_e1m2_t dst1, __ubuf__ fp4x2_e1m2_t* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_int8_t dst0, vector_int8_t dst1, __ubuf__ int8_t* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_uint8_t dst0, vector_uint8_t dst1, __ubuf__ uint8_t* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_fp8_e8m0_t dst0, vector_fp8_e8m0_t dst1, __ubuf__ fp8_e8m0_t* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_fp8_e5m2_t dst0, vector_fp8_e5m2_t dst1, __ubuf__ fp8_e5m2_t* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_fp8_e4m3fn_t dst0, vector_fp8_e4m3fn_t dst1, __ubuf__ fp8_e4m3fn_t* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_hifloat8_t dst0, vector_hifloat8_t dst1, __ubuf__ hifloat8_t* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_int16_t dst0, vector_int16_t dst1, __ubuf__ int16_t* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_uint16_t dst0, vector_uint16_t dst1, __ubuf__ uint16_t* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_half dst0, vector_half dst1, __ubuf__ half* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_bfloat16_t dst0, vector_bfloat16_t dst1, __ubuf__ bfloat16_t* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_int32_t dst0, vector_int32_t dst1, __ubuf__ int32_t* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_uint32_t dst0, vector_uint32_t dst1, __ubuf__ uint32_t* src, int32_t offset) __simd_callee__ inline void asc_loadalign_deintlv_postupdate(vector_float dst0, vector_float dst1, __ubuf__ float* src, int32_t offset)参数说明参数名输入/输出说明dst0输出第一个目的向量寄存器。dst1输出第二个目的向量寄存器。src输入/输出源数据在UB中的起始地址要求32B对齐。接口执行完成后src会更新为src offset。offset输入地址偏移量单位为元素个数。向量寄存器类型的详细说明请参见reg数据类型定义.md。数据类型asc_loadalign_deintlv_postupdate支持的数据类型如下表所示。源数据类型src目的寄存器类型dst0/dst1int4b_tvector_int4x2_tfp4x2_e1m2_tvector_fp4x2_e1m2_tfp4x2_e2m1_tvector_fp4x2_e2m1_tint8_tvector_int8_tuint8_tvector_uint8_tfp8_e4m3fn_tvector_fp8_e4m3fn_tfp8_e5m2_tvector_fp8_e5m2_tfp8_e8m0_tvector_fp8_e8m0_thifloat8_tvector_hifloat8_tint16_tvector_int16_tuint16_tvector_uint16_thalfvector_halfbfloat16_tvector_bfloat16_tint32_tvector_int32_tuint32_tvector_uint32_tfloatvector_float返回值说明无。流水类型PIPE_V约束说明src必须为32B对齐地址且访问范围不能超过UB有效地址上界减去2 x VL否则可能导致UB越界访问。在循环中使用本接口时offset的取值需要保证更新后的src仍满足32B对齐要求。offset以元素为单位实际地址步长需要结合源数据类型宽度进行换算。调用示例从UB中连续读取以32B对齐地址src为起始位置的float数据并在每次调用后自动更新地址。for (uint16_t i 0; i repeat_times; i) { asc_loadalign_deintlv_postupdate(reg0, reg1, src, one_repeat_size); ... }创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考