news 2026/7/16 18:50:32

CANN/asc-devkit:reg数据类型定义

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/asc-devkit:reg数据类型定义

reg数据类型定义

【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit

矢量数据寄存器

矢量数据寄存器用于存储矢量数据,其位宽为VL(Vector Length),可存储VL/sizeof(T)的数据(T表示数据类型)。在Ascend 950PR/Ascend 950DT版本中, VL = 256B。例如对于矢量数据类型vector_float,该寄存器可存储的元素数量为256B / sizeof(float) = 64个。

以下是以位宽为分类,列举的所有矢量数据寄存器的数据类型:

位宽矢量数据类型
b8vector_int8_t/vector_uint8_t/vector_int4x2_t/vector_fp4x2_e2m1_t/vector_fp4x2_e1m2_t/vector_hifloat8_t/vector_fp8_e4m3fn_t/vector_fp8_e5m2_t/vector_fp8_e8m0_t
b16vector_int16_t/vector_uint16_t/vector_half/vector_bfloat16_t
b32vector_int32_t/vector_uint32_t/vector_float
b64vector_int64_t/vector_uint64_t

注意:vector_int4x2_t、vector_fp4x2_e2m1_t、vector_fp4x2_e1m2_t这三个矢量数据类型在内存中的排布需要将两个元素打包为一个字节的存储单元。

调用示例

vector_half dst; half index = 0; asc_arange(dst, index);

掩码寄存器

掩码寄存器的数据类型为vector_bool,用于矢量计算中选择参与计算的元素,其位宽为VL/8。当搬运掩码寄存器时,ubuf中地址偏移单位为字节。

调用示例

uint32_t length = 255; vector_bool mask = asc_create_mask_b16(PAT_ALL); // 创建一个所有元素为True的掩码寄存器 vector_bool mask = asc_update_mask_b16(length); // 根据矢量计算需要操作的元素的具体数量,生成对应的掩码寄存器

非对齐寄存器

非对齐寄存器包括vector_load_unalign和vector_store_unalign。这些寄存器作为缓冲区,用于在UB和矢量数据寄存器之间进行连续的非对齐数据搬运,其中非对齐特指数据起始地址未按32字节对齐。在搬运过程中,非对齐数据首先被加载到专用的非对齐寄存器,随后通过相应的搬运接口完成数据的分块读取或写入。

在读非对齐地址前,vector_load_unalign应该通过asc_loadunalign_pre初始化,然后再使用asc_loadunalign。在写非对齐地址时,应先使用asc_storeunalign,再使用asc_storeunalign_post进行处理。

调用示例

constexpr uint32_t one_repeat_size = 256 / sizeof(int8_t); // VL / sizeof(T) uint32_t total_length = 255; uint32_t repeat_time = (total_length + one_repeat_size - 1) / one_repeat_size; __simd_vf__ inline void neg_vf(__ubuf__ int8_t* dst_addr, __ubuf__ int8_t* src_addr, uint32_t count, uint32_t one_repeat_size, uint16_t repeat_time) { vector_int8_t src; vector_int8_t dst; vector_load_unalign ureg0; vector_store_unalign ureg1; vector_bool mask; for (uint16_t i = 0; i < repeat_time; ++i) { mask = asc_update_mask_b8(count); asc_loadunalign_pre(ureg0, src_addr + i * one_repeat_size); // 非对齐搬入前的初始化 asc_loadunalign(src, ureg0, src_addr + i * one_repeat_size); // 配合vector_load_unalign的使用,非对齐搬入源数据 asc_neg(dst, src, mask); asc_storeunalign(dst_addr + i * one_repeat_size, ureg1, dst, one_repeat_size); // 配合vector_store_unalign的使用,非对齐搬出目的数据 asc_storeunalign_post(dst_addr + i * one_repeat_size, ureg1, 0); // 处理非对齐搬出的尾块 } }

地址寄存器

地址寄存器的数据类型为addr_reg,用于存储地址偏移量。addr_reg通过asc_create_addr_reg初始化,然后在循环之中使用addr_reg存储地址偏移量。addr_reg在每层循环中根据所设置的步长进行自增。

调用示例

单参数版本
constexpr uint32_t one_repeat_size = 256 / sizeof(int8_t); // VL / sizeof(T) uint32_t total_length = 256; uint32_t repeat_time = total_length / one_repeat_size; __simd_vf__ inline void add_vf(__ubuf__ int8_t* dst_addr, __ubuf__ int8_t* src0_addr, __ubuf__ int8_t* src1_addr, uint32_t count, uint32_t one_repeat_size, uint16_t repeat_time) { vector_int8_t src0; vector_int8_t src1; vector_int8_t dst; vector_bool mask; addr_reg addr_reg; for (uint16_t i = 0; i < repeat_time; ++i) { addr_reg = asc_create_addr_reg_b8(one_repeat_size); // 通过初始化addr_reg,每一次循环,地址偏移one_repeat_size mask = asc_update_mask_b8(count); asc_loadalign(src0, src0_addr, addr_reg); asc_loadalign(src1, src1_addr, addr_reg); asc_add(dst, src0, src1, mask); asc_storealign(dst_addr, dst, addr_reg, mask); } }
多参数版本(以4参数为例)
__simd_vf__ inline void add_4d_vf( __ubuf__ float* dst_addr, __ubuf__ float* src_addr, uint32_t n_stride, // N间偏移 = C×H×W (float元素数) uint32_t c_stride, // C间偏移 = H×W (float元素数) uint32_t h_stride, // H间偏移 = W (float元素数) uint32_t w_stride, // W间偏移 = 64 (一个VL的float数) uint16_t N, uint16_t C, uint16_t H, uint16_t W) { vector_float src_reg, dst_reg; vector_bool mask = asc_create_mask_b32(PAT_ALL); addr_reg a_reg; for (uint16_t n = 0; n < N; n++) { for (uint16_t c = 0; c < C; c++) { for (uint16_t h = 0; h < H; h++) { for (uint16_t w = 0; w < W; w++) { a_reg = asc_create_addr_reg_b32(n_stride, c_stride, h_stride, w_stride); asc_loadalign(src_reg, src_addr, a_reg); asc_add(dst_reg, src_reg, src_reg, mask); asc_storealign(dst_addr, dst_reg, a_reg, mask); } } } } }

【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 18:50:25

原神抽卡记录导出工具终极指南:3步轻松备份分析你的抽卡历史

原神抽卡记录导出工具终极指南&#xff1a;3步轻松备份分析你的抽卡历史 【免费下载链接】genshin-wish-export Easily export the Genshin Impact wish record. 项目地址: https://gitcode.com/GitHub_Trending/ge/genshin-wish-export 原神抽卡记录导出工具是一款专为…

作者头像 李华
网站建设 2026/7/16 18:49:36

Mac Mouse Fix:如何让10美元鼠标超越苹果触控板体验?

Mac Mouse Fix&#xff1a;如何让10美元鼠标超越苹果触控板体验&#xff1f; 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 你是否曾经为macOS…

作者头像 李华
网站建设 2026/7/16 18:48:09

5分钟搭建终极个人数字图书馆:Talebook完整指南

5分钟搭建终极个人数字图书馆&#xff1a;Talebook完整指南 【免费下载链接】talebook 一个简单好用的个人书库 项目地址: https://gitcode.com/gh_mirrors/ta/talebook 想要拥有一个完全属于自己的数字图书馆吗&#xff1f;Talebook私有书库是一个基于Calibre的简单好用…

作者头像 李华
网站建设 2026/7/16 18:47:39

CANN Ascend C SIMD掩码更新函数

asc_update_mask 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcod…

作者头像 李华
网站建设 2026/7/16 18:46:46

MPL_ROS与ROS 2迁移指南:从ROS Kinetic到ROS 2 Foxy的完整迁移方案

MPL_ROS与ROS 2迁移指南&#xff1a;从ROS Kinetic到ROS 2 Foxy的完整迁移方案 【免费下载链接】mpl_ros A ROS wrapper for trajectory planning based on motion primitives 项目地址: https://gitcode.com/gh_mirrors/mp/mpl_ros 欢迎来到MPL_ROS&#xff08;Motion …

作者头像 李华