asc_storeunalign_post_postupdate【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√功能说明reg计算数据搬运接口适用于从矢量数据寄存器连续非32B对齐的起始地址连续搬出到UB的尾块场景。该接口每调用一次接口会更新目的操作数在UB上的地址。需要先调用下列接口之一后再调用本接口。asc_storeunalign_postupdate使用uint32_t作为存储偏移量的接口。搬运原理如下 记目的操作数的起始地址为 dst_start结束地址为 dst_end尾块元素个数为 unalign_count (dst_end - dst_end / 32 * 32) / sizeof(T)。 则搬运的数据会分为两部分分别是32B对齐的主块部分[dst_start, dst_end - unalign_count * sizeof(T)]。非32B对齐的尾块部分[dst_end - unalign_count * sizeof(T), dst_end]。 store_unalign或store_unalign_postupdate接口执行时会将主块搬出至UB尾块暂存至非对齐寄存器[0, unalign_count]。 本接口执行时会将尾块从非对齐寄存器[0, unalign_count]搬出至UB。函数原型__simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ int8_t* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ uint8_t* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ fp4x2_e2m1_t* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ fp4x2_e1m2_t* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ int4b_t* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ fp8_e8m0_t* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ fp8_e5m2_t* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ fp8_e4m3fn_t* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ hifloat8_t* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ int16_t* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ uint16_t* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ half* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ bfloat16_t* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ int32_t* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ uint32_t* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ float* dst, vector_store_unalign src, int32_t offset) __simd_callee__ inline void asc_storeunalign_post_postupdate(__ubuf__ int64_t* dst, vector_store_unalign src, int32_t offset)参数说明参数名输入/输出描述dst输出目的操作数矢量的起始地址。src输入非对齐寄存器用于保存非对齐数据长度32B。offset输入目的操作数结束地址的偏移类型为地址寄存器单位为元素个数。非对齐寄存器和地址寄存器的详细说明请参见reg数据类型定义.md。返回值说明无流水类型PIPE_V约束说明该接口中的dst不需要32B对齐但数据类型为T的dst需要sizeof(T) Byte对齐。调用本接口之前需要调用asc_storeunalign_postupdate使用uint32_t作为存储偏移量的接口且本接口与前序接口的非对齐寄存器要保持一致。调用示例// dst地址为8非32B对齐占用的地址为UB[8:520]。 __ubuf__ uint32_t* dst (__ubuf__ uint32_t*)asc_get_phy_buf_addr(8); vector_store_unalign ureg; vector_uint32_t src; uint32_t count 64; uint32_t repeat 2; for (uint32_t i 0; i repeat; i) { // 其他reg操作 // 第一次src[0:62] 写入 dst[0:62]即UB[8:256]同时src[62:64] 写入 ureg[0:2]同时dst自增为dst[64]即UB[264] // 第二次ureg[0:2] src[0:62] 写入 dst[-2:62]即UB[256:512]同时src[62:64] 写入 ureg[0:2]同时dst自增为dst[128]即UB[520] asc_storeunalign_postupdate(dst[i * count], ureg, src, count); } // dst结束地址为520但此时dst已经自增到了520所以offset要配置为0 int32_t offset repeat * count; // ureg[0:2] 写入 dst[126:128]即UB[512:520] asc_storeunalign_post(dst, ureg, offset);【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考