news 2026/5/21 16:06:03

CANN/asc-devkit L1到L0B数据搬运

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/asc-devkit L1到L0B数据搬运

asc_copy_l12l0b

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

产品支持情况

产品是否支持
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品

功能说明

用于搬运存放在L1 Buffer里的512B大小的矩阵到L0B Buffer里。包含2D格式搬运、3D格式搬运。

函数原型

  • 高维切分搬运 2D格式

    __aicore__ inline void asc_copy_l12l0b(__cb__ int4b_t* dst, __cbuf__ int4b_t* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap) __aicore__ inline void asc_copy_l12l0b(__cb__ uint8_t* dst, __cbuf__ uint8_t* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap) __aicore__ inline void asc_copy_l12l0b(__cb__ int8_t* dst, __cbuf__ int8_t* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap) __aicore__ inline void asc_copy_l12l0b(__cb__ half* dst, __cbuf__ half* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap) __aicore__ inline void asc_copy_l12l0b(__cb__ bfloat16_t* dst, __cbuf__ bfloat16_t* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap) __aicore__ inline void asc_copy_l12l0b(__cb__ uint32_t* dst, __cbuf__ uint32_t* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap) __aicore__ inline void asc_copy_l12l0b(__cb__ int32_t* dst, __cbuf__ int32_t* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap) __aicore__ inline void asc_copy_l12l0b(__cb__ float* dst, __cbuf__ float* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap)
  • 同步高维切分搬运 2D格式

    __aicore__ inline void asc_copy_l12l0b_sync(__cb__ int4b_t* dst, __cbuf__ int4b_t* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap) __aicore__ inline void asc_copy_l12l0b_sync(__cb__ uint8_t* dst, __cbuf__ uint8_t* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap) __aicore__ inline void asc_copy_l12l0b_sync(__cb__ int8_t* dst, __cbuf__ int8_t* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap) __aicore__ inline void asc_copy_l12l0b_sync(__cb__ half* dst, __cbuf__ half* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap) __aicore__ inline void asc_copy_l12l0b_sync(__cb__ bfloat16_t* dst, __cbuf__ bfloat16_t* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap) __aicore__ inline void asc_copy_l12l0b_sync(__cb__ uint32_t* dst, __cbuf__ uint32_t* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap) __aicore__ inline void asc_copy_l12l0b_sync(__cb__ int32_t* dst, __cbuf__ int32_t* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap) __aicore__ inline void asc_copy_l12l0b_sync(__cb__ float* dst, __cbuf__ float* src, uint16_t start_index, uint8_t repeat, uint16_t src_stride, uint16_t dst_gap)
  • 高维切分搬运 3D格式

    __aicore__ inline void asc_copy_l12l0b(__cb__ half* dst, __cbuf__ half* src, uint16_t k_extension, uint16_t m_extension, uint16_t k_start_pt, uint16_t m_start_pt, uint8_t stride_w, uint8_t stride_h, uint8_t filter_w, uint8_t filter_h, uint8_t dilation_filter_w, uint8_t dilation_filter_h, bool filter_size_w, bool filter_size_h, bool transpose, bool f_matrix_ctrl, uint16_t channel_size) __aicore__ inline void asc_copy_l12l0b(__cb__ bfloat16_t* dst, __cbuf__ bfloat16_t* src, uint16_t k_extension, uint16_t m_extension, uint16_t k_start_pt, uint16_t m_start_pt, uint8_t stride_w, uint8_t stride_h, uint8_t filter_w, uint8_t filter_h, uint8_t dilation_filter_w, uint8_t dilation_filter_h, bool filter_size_w, bool filter_size_h, bool transpose, bool f_matrix_ctrl, uint16_t channel_size) __aicore__ inline void asc_copy_l12l0b(__cb__ uint32_t* dst, __cbuf__ uint32_t* src, uint16_t k_extension, uint16_t m_extension, uint16_t k_start_pt, uint16_t m_start_pt, uint8_t stride_w, uint8_t stride_h, uint8_t filter_w, uint8_t filter_h, uint8_t dilation_filter_w, uint8_t dilation_filter_h, bool filter_size_w, bool filter_size_h, bool transpose, bool f_matrix_ctrl, uint16_t channel_size) __aicore__ inline void asc_copy_l12l0b(__cb__ int32_t* dst, __cbuf__ int32_t* src, uint16_t k_extension, uint16_t m_extension, uint16_t k_start_pt, uint16_t m_start_pt, uint8_t stride_w, uint8_t stride_h, uint8_t filter_w, uint8_t filter_h, uint8_t dilation_filter_w, uint8_t dilation_filter_h, bool filter_size_w, bool filter_size_h, bool transpose, bool f_matrix_ctrl, uint16_t channel_size) __aicore__ inline void asc_copy_l12l0b(__cb__ float* dst, __cbuf__ float* src, uint16_t k_extension, uint16_t m_extension, uint16_t k_start_pt, uint16_t m_start_pt, uint8_t stride_w, uint8_t stride_h, uint8_t filter_w, uint8_t filter_h, uint8_t dilation_filter_w, uint8_t dilation_filter_h, bool filter_size_w, bool filter_size_h, bool transpose, bool f_matrix_ctrl, uint16_t channel_size)
  • 同步高维切分搬运 3D格式

    __aicore__ inline void asc_copy_l12l0b_sync(__cb__ half* dst, __cbuf__ half* src, uint16_t k_extension, uint16_t m_extension, uint16_t k_start_pt, uint16_t m_start_pt, uint8_t stride_w, uint8_t stride_h, uint8_t filter_w, uint8_t filter_h, uint8_t dilation_filter_w, uint8_t dilation_filter_h, bool filter_size_w, bool filter_size_h, bool transpose, bool f_matrix_ctrl, uint16_t channel_size) __aicore__ inline void asc_copy_l12l0b_sync(__cb__ bfloat16_t* dst, __cbuf__ bfloat16_t* src, uint16_t k_extension, uint16_t m_extension, uint16_t k_start_pt, uint16_t m_start_pt, uint8_t stride_w, uint8_t stride_h, uint8_t filter_w, uint8_t filter_h, uint8_t dilation_filter_w, uint8_t dilation_filter_h, bool filter_size_w, bool filter_size_h, bool transpose, bool f_matrix_ctrl, uint16_t channel_size) __aicore__ inline void asc_copy_l12l0b_sync(__cb__ uint32_t* dst, __cbuf__ uint32_t* src, uint16_t k_extension, uint16_t m_extension, uint16_t k_start_pt, uint16_t m_start_pt, uint8_t stride_w, uint8_t stride_h, uint8_t filter_w, uint8_t filter_h, uint8_t dilation_filter_w, uint8_t dilation_filter_h, bool filter_size_w, bool filter_size_h, bool transpose, bool f_matrix_ctrl, uint16_t channel_size) __aicore__ inline void asc_copy_l12l0b_sync(__cb__ int32_t* dst, __cbuf__ int32_t* src, uint16_t k_extension, uint16_t m_extension, uint16_t k_start_pt, uint16_t m_start_pt, uint8_t stride_w, uint8_t stride_h, uint8_t filter_w, uint8_t filter_h, uint8_t dilation_filter_w, uint8_t dilation_filter_h, bool filter_size_w, bool filter_size_h, bool transpose, bool f_matrix_ctrl, uint16_t channel_size) __aicore__ inline void asc_copy_l12l0b_sync(__cb__ float* dst, __cbuf__ float* src, uint16_t k_extension, uint16_t m_extension, uint16_t k_start_pt, uint16_t m_start_pt, uint8_t stride_w, uint8_t stride_h, uint8_t filter_w, uint8_t filter_h, uint8_t dilation_filter_w, uint8_t dilation_filter_h, bool filter_size_w, bool filter_size_h, bool transpose, bool f_matrix_ctrl, uint16_t channel_size)

参数说明

表1 2D格式参数说明 | 参数名 | 输入/输出 | 描述 | | :--- | :--- | :--- | | dst | 输出 | 目的L0B Buffer地址。 | | src | 输入 | 源L1 Buffer地址。 | | start_index | 输入 | 分形矩阵ID,说明搬运起始位置为源操作数中第几个分形(0为源操作数中第1个分形矩阵)。取值范围:[0, 65535]。单位为512字节。 | | repeat | 输入 | 迭代次数,每个迭代可以处理512B数据。取值范围:[1, 255]。 | | src_stride | 输入 | 相邻迭代间,源操作数前一个分形与后一个分形起始地址的间隔。取值范围:[0, 65535]。单位为512字节。 | | dst_gap | 输入 | 目的操作数相邻连续数据块的间隔(前面一个数据块的尾与后面一个数据块的头的间隔)。取值范围:[0, 65535]。单位为512字节。 |

表2 3D格式参数说明 | 参数名 | 输入/输出 | 描述 | | :--- | :--- | :--- | | dst | 输出 | 目的L0B Buffer地址。 | | src | 输入 | 源L1 Buffer地址。 | | k_extension | 输入 | 该指令在目的操作数width维度的传输长度。如果不覆盖最右侧的分形,对于half类型,应为16的倍数,对于int8_t/uint8_t类型,应为32的倍数;如果覆盖最右侧的分形,则无倍数要求。取值范围:[1, 65535]。 | | m_extension | 输入 | 该指令在目的操作数height维度的传输长度。如果不覆盖最下侧的分形,对于half/int8_t/uint8_t类型,应为16的倍数;如果覆盖最下侧的分形,则无倍数要求。取值范围:[1, 65535]。 | | k_start_pt | 输入 | 该指令在目的操作数width维度的起点。对于half类型,应为16的倍数,对于int8_t/uint8_t类型,应为32的倍数。取值范围:[0, 65535] | | m_start_pt | 输入 | 该指令在目的操作数height维度的起点,如果不覆盖最下侧的分形,对于half/int8_t/uint8_t,应为16的倍数;如果覆盖最下侧的分形,则无倍数要求。取值范围:[0, 65535] 。| | stride_w | 输入 | 卷积核在源操作数width维度滑动的步长,取值范围:[1, 63]。 | | stride_h | 输入 | 卷积核在源操作数height维度滑动的步长,取值范围:[1, 63]。 | | filter_w | 输入 | 卷积核width,取值范围:[1, 255]。 | | filter_h | 输入 | 卷积核height,取值范围:[1, 255]。 | | dilation_filter_w | 输入 | 卷积核width膨胀系数,取值范围:[1, 255]。 | | dilation_filter_h | 输入 | 卷积核height膨胀系数,取值范围:[1, 255]。 | | filter_size_w | 输入 | 是否在filter_w的基础上将卷积核width增加256个元素。true表示增加;false表示不增加。 | | filter_size_h | 输入 | 是否在filter_h的基础上将卷积核height增加256个元素。true表示增加;false表示不增加。 | | transpose | 输入 | 是否启用转置功能,对整个目标矩阵进行转置,仅在源操作数为half类型时有效。true表示启用;false表示不启用。 | | f_matrix_ctrl | 输入 | 表示asc_copy_l12l0b指令从左矩阵还是右矩阵获取FeatureMap的属性描述,当前只支持设置为false。 | | channel_size | 输入 | 源操作数的通道数,取值范围:[1, 63]。 对于uint32_t/int32_t/float,channelSize可取值为4,N * 8,N * 8 + 4;对于half/bfloat16,channelSize可取值为4,8,N * 16,N * 16 + 4,N * 16 + 8;对于int8_t/uint8_t,channelSize可取值为4,8,16, 32 * N,N * 32 + 4,N * 32 + 8,N * 32 + 16;对于int4b_t,ChannelSize可取值为8,16,32,N * 64,N * 64 + 8,N * 64 + 16,N * 64 + 32。N为正整数。|

返回值说明

流水类型

PIPE_MTE1

约束说明

  • dst的起始地址需要512字节对齐,src的起始地址需要32字节对齐。
  • 本接口不支持2D格式搬运的转置场景,若要实现请参考asc_copy_l12l0b_trans。

3D数据格式说明

要求输入的feature map和filter的格式是 NC1HWC0,其中 C0 是最低维度而且 C0 是固定值为 16(对于u8/s8类型为32),C1=C/C0。

为了简化场景,以下场景假设输入的 feature map 的 channel 为4,即 Ci=4。输入 feature maps 在 A1 中的形状为 (Hi,Wi,Ci),经过 load3dv1 处理后在 A2 的数据形状为(WoHo, HkWk*Ci)。其中 Wo 和 Ho 是卷积后输出的shape,Hk 和 Wk 是 filter 的 shape。

直观的来看,img2col 的过程就是 filter 在 feature map 上扫过,将对应 feature map 的数据展开成输出数据的每一行的过程。filter 首先在W方向上滑动 Wo 步,然后在 H 方向上走一步然后重复以上过程,最终输出 Wo * Ho 行数据。下图中红色和黄色的数据分别代表第一行和第二行。数字表示原始输入数据,filter 和输出数据三者之间的关联关系。可以看到,load3dv1 首先在输入数据的 Ci 维度搬运对应于 00 的 4 个数,然后搬运对应于 01 的四个数,最终这一行的大小为 HkWkCi 即 334=36 个数。

  • 对应的feature map格式如下图:

  • 对应的 filter 的格式如下图:

其中 n 为 filter 的个数,可以看出维度排布为 (Hk,Wk,Ci,n),但是需要注意的是下图的格式还需要根据Mmad中B矩阵的格式转换。

实际操作中,由于存储空间或者计算能力限制,我们通常会将整个卷积计算分块,一次只搬运并计算一小块数据。

对于 A2 的 feature map 来说有两种方案,水平分块和垂直分块。分别对应参数中 repeatMode 的 0 和 1。

注:下图中的分形矩阵大小为 4x4,实际应该为 16x16 (对于 u8/s8 类型为 16x32)

repeatMode =0 时,每次 repeat 会改变在 filter 窗口中读取数据点的位置,然后跳到下一个 C0 的位置。

repeatMode =1 的时候 filter 窗口中读取数据的位置保持不变,每个 repeat 在 feature map 中前进 C0 个元素。

调用示例

__cbuf__ half src[256]; __cb__ half dst[256]; asc_copy_l12l0b(dst, src, 1, 1, 1, 0);

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

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

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

使用nodejs配合taotoken api构建实时聊天应用后端

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用 Node.js 配合 Taotoken API 构建实时聊天应用后端 本文面向 Node.js 后端开发者,介绍如何利用 OpenAI 官方 Node.…

作者头像 李华
网站建设 2026/5/21 16:00:11

WinDiskWriter:在Mac上轻松制作Windows启动盘的终极指南

WinDiskWriter:在Mac上轻松制作Windows启动盘的终极指南 【免费下载链接】windiskwriter 🖥 Windows Bootable USB creator for macOS. 🛠 Patches Windows 11 to bypass TPM and Secure Boot requirements. 👾 UEFI & Legacy…

作者头像 李华
网站建设 2026/5/21 15:58:04

戴尔G15散热终极指南:开源工具TCC-G15让你的笔记本告别过热降频

戴尔G15散热终极指南:开源工具TCC-G15让你的笔记本告别过热降频 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 你是否在游戏或高强度工作时遭遇戴…

作者头像 李华
网站建设 2026/5/21 15:57:05

Honey Select 2终极增强补丁:3分钟解锁完整游戏体验

Honey Select 2终极增强补丁:3分钟解锁完整游戏体验 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 如果你正在寻找一款能够彻底改变Honey Select 2…

作者头像 李华
网站建设 2026/5/21 15:57:04

AI热点资讯日报 | AI Daily News - 2026年5月21日 (May 21, 2026)

文章目录AI热点资讯日报 | AI Daily News - 2026年5月21日 (May 21, 2026)【大模型技术突破】Large Language Model BreakthroughsGoogle I/O 2026发布Gemini Omni多模态模型国产大模型Token调用量超美国两倍GPT-5.5、DeepSeek V4、Claude 4.6密集发布【AI投融资动态】AI Inves…

作者头像 李华