news 2026/5/11 7:40:55

CANN/asc-devkit L0C到L1数据搬运量化API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/asc-devkit L0C到L1数据搬运量化API

asc_copy_l0c2l1

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

产品支持情况

产品是否支持
Ascend 950PR/Ascend 950DT

功能说明

矩阵计算完成后,对结果进行量化处理,之后将处理结果搬运到L1 Buffer中。量化参数共有2个:quant_pre和quant_post,分别对应预处理和后处理阶段。

quant_pre可选量化模式,分别为:

  • NoQuant:不使能量化功能。
  • F322BF16:float量化成bfloat16_t。量化结果不支持INF_NAN模式。
  • F322F16:float量化成half。量化结果支持INF_NAN模式。
  • DEQF16:int32_t量化成half。量化结果不支持INF_NAN模式。
  • VDEQF16:int32_t量化成half。量化结果不支持INF_NAN模式。
  • QF322B8_PRE:float量化成uint8_t/int8_t。scalar量化。
  • VQF322B8_PRE:float量化成uint8_t/int8_t。scalar量化。
  • REQ8:int32_t量化成uint8_t/int8_t。scalar量化。
  • VREQ8:int32_t量化成uint8_t/int8_t。矢量量化。
  • QF322FP8_PRE:float量化成fp8_e4m3fn_t,scalar量化。
  • VQF322FP8_PRE:float量化成fp8_e4m3fn_t,矢量量化。
  • QF322HIF8_PRE:float量化成hifloat8_t(Half to Away Round),scalar量化。
  • VQF322HIF8_PRE:float量化成hifloat8_t(Half to Away Round),矢量量化。
  • QF322HIF8_PRE_HYBRID:float量化成hifloat8_t(Hybrid Round),scalar量化。
  • VQF322HIF8_PRE_HYBRID:float量化成hifloat8_t(Hybrid Round),矢量量化。
  • QS322BF16_PRE:int32_t量化成bfloat16_t,scalar量化。
  • VQS322BF16_PRE:int32_t量化成bfloat16_t,矢量量化。
  • QF322F16_PRE:float量化成half,scalar量化。
  • VQF322F16_PRE:float量化成half,矢量量化。
  • QF322BF16_PRE:float量化成bfloat16_t,scalar量化。
  • VQF322BF16_PRE:float量化成bfloat16_t,矢量量化。
  • QF322BF16_PRE:float量化成float,scalar量化。该量化模式精度无法达到双万分之一,可以达到双千分之一。
  • VQF322BF16_PRE:float量化成float,矢量量化。该量化模式精度无法达到双万分之一,可以达到双千分之一。

quant_post可选量化模式,分别为:

  • NoConv:不使能量化功能。
  • QS162B8_POST:int16_t量化成bfloat8_t,scalar量化。
  • VQS162B8_POST:int16_t量化成bfloat8_t,矢量量化。
  • QF162B8_POST:half量化成bfloat8_t,scalar量化。
  • VQF162B8_POST:half量化成bfloat8_t,矢量量化。
  • QS162S4_POST:int16_t量化成int4_t,scalar量化。
  • VQS162S4_POST:int16_t量化成int4_t,矢量量化。
  • QF162S4_POST:half量化成int4_t类型,scalar量化。
  • VQF162S4_POST:half量化成int4_t类型,矢量量化。
  • QS162S16_POST:int16_t量化成int16_t,scalar量化。
  • VQS162S16_POST:int16_t量化成int16_t,矢量量化。
  • QF162S16_POST:half量化成int16_t,scalar量化。
  • VQF162S16_POST:half量化成int16_t,矢量量化。

函数原型

__aicore__ inline void asc_copy_l0c2l1(__cbuf__ half* dst, __cc__ float* src, uint16_t n_size, uint16_t m_size, uint32_t dst_stride, uint16_t src_stride, uint8_t clip_relu_pre, uint8_t unit_flag_mode, uint64_t quant_pre, uint8_t relu_pre, bool channel_split, bool nz2nd_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwise_op, uint8_t eltwise_antq_cfg, bool c0_pad_en) __aicore__ inline void asc_copy_l0c2l1(__cbuf__ int8_t* dst, __cc__ float* src, uint16_t n_size, uint16_t m_size, uint32_t dst_stride, uint16_t src_stride, uint8_t clip_relu_pre, uint8_t unit_flag_mode, uint64_t quant_pre, uint8_t relu_pre, bool channel_split, bool nz2nd_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwise_op, uint8_t eltwise_antq_cfg, bool c0_pad_en) __aicore__ inline void asc_copy_l0c2l1(__cbuf__ uint8_t* dst, __cc__ float* src, uint16_t n_size, uint16_t m_size, uint32_t dst_stride, uint16_t src_stride, uint8_t clip_relu_pre, uint8_t unit_flag_mode, uint64_t quant_pre, uint8_t relu_pre, bool channel_split, bool nz2nd_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwise_op, uint8_t eltwise_antq_cfg, bool c0_pad_en) __aicore__ inline void asc_copy_l0c2l1(__cbuf__ float* dst, __cc__ float* src, uint16_t n_size, uint16_t m_size, uint32_t dst_stride, uint16_t src_stride, uint8_t clip_relu_pre, uint8_t unit_flag_mode, uint64_t quant_pre, uint8_t relu_pre, bool channel_split, bool nz2nd_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwise_op, uint8_t eltwise_antq_cfg, bool c0_pad_en) __aicore__ inline void asc_copy_l0c2l1(__cbuf__ half* dst, __cc__ int32_t* src, uint16_t n_size, uint16_t m_size, uint32_t dst_stride, uint16_t src_stride, uint8_t clip_relu_pre, uint8_t unit_flag_mode, uint64_t quant_pre, uint8_t relu_pre, bool channel_split, bool nz2nd_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwise_op, uint8_t eltwise_antq_cfg, bool c0_pad_en) __aicore__ inline void asc_copy_l0c2l1(__cbuf__ int8_t* dst, __cc__ int32_t* src, uint16_t n_size, uint16_t m_size, uint32_t dst_stride, uint16_t src_stride, uint8_t clip_relu_pre, uint8_t unit_flag_mode, uint64_t quant_pre, uint8_t relu_pre, bool channel_split, bool nz2nd_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwise_op, uint8_t eltwise_antq_cfg, bool c0_pad_en) __aicore__ inline void asc_copy_l0c2l1(__cbuf__ uint8_t* dst, __cc__ int32_t* src, uint16_t n_size, uint16_t m_size, uint32_t dst_stride, uint16_t src_stride, uint8_t clip_relu_pre, uint8_t unit_flag_mode, uint64_t quant_pre, uint8_t relu_pre, bool channel_split, bool nz2nd_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwise_op, uint8_t eltwise_antq_cfg, bool c0_pad_en) __aicore__ inline void asc_copy_l0c2l1(__cbuf__ int32_t* dst, __cc__ int32_t* src, uint16_t n_size, uint16_t m_size, uint32_t dst_stride, uint16_t src_stride, uint8_t clip_relu_pre, uint8_t unit_flag_mode, uint64_t quant_pre, uint8_t relu_pre, bool channel_split, bool nz2nd_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwise_op, uint8_t eltwise_antq_cfg, bool c0_pad_en) __aicore__ inline void asc_copy_l0c2l1(__cbuf__ void *dst, __cc__ float *src, uint16_t n_size, uint16_t m_size, uint32_t dst_stride, uint16_t src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_mode, uint64_t quant_pre, uint8_t relu_pre, bool channel_split, bool nz2nd_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwise_op, bool eltwise_antq_en, bool C0_pad_en, bool broadcast_en, bool NZ2DN_en) __aicore__ inline void asc_copy_l0c2l1(__cbuf__ void *dst, __cc__ int32_t *src, uint16_t n_size, uint16_t m_size, uint32_t dst_stride, uint16_t src_stride, uint8_t l2_cache_ctl, uint8_t clip_relu_pre, uint8_t unit_flag_mode, uint64_t quant_pre, uint8_t relu_pre, bool channel_split, bool nz2nd_en, uint64_t quant_post, uint8_t relu_post, bool clip_relu_post, uint8_t eltwise_op, bool eltwise_antq_en, bool C0_pad_en, bool broadcast_en, bool NZ2DN_en)

参数说明

参数名输入/输出描述
dst输出目的操作数(矢量)的起始地址。
src输入源操作数(矢量)的起始地址。
n_size输入源NZ矩阵在N方向上的大小。
• 不使能NZ2ND功能,取值范围:[1, 4095];
• 使能NZ2ND功能,取值范围:[1, 4095]。
m_size输入源NZ矩阵在M方向上的大小。
• 不使能NZ2ND功能,取值范围:[1, 65535];
• 使能NZ2ND功能,取值范围:[1, 8192]。
dst_stride输入目的相邻ND矩阵起始地址之间的偏移。
src_stride输入源NZ矩阵中相邻Z排布的起始地址偏移,取值范围:[0, 65535],单位:C0_Size(16*sizeof(T),T为src的数据类型)。
l2_cache_ctl输入配置数据在L2 Cache中的管理策略。取值说明如下:
• 0:DISABLE模式,适用于仅需访问一次的数据。
• 1:NORMAL模式,适用于重用模式未知或不极端的数据。
• 2:LAST模式,适用于高频重复访问的数据。
• 4:PERSISTENT模式,适用于需要长期驻留在缓存中的数据。
clip_relu_pre输入预处理阶段使能clip_relu,需搭配normal relu(归一化的relu函数)一起使用且需要使能量化功能。
uint_flag_mode输入与unit_flag参数相关,取值如下:
•0 保留值;
•2 使能unit_flag,硬件执行完指令之后,不会设置寄存器;
•3 使能unit_flag,硬件执行完指令后,会将unit_flag关闭。
quant_pre输入预处理阶段量化参数。取值见功能说明。
relu_pre输入预处理阶段使能relu。
channel_split输入是否使能通道拆分的功能,默认false,不使能该功能。仅在src和dst都为float时才能使能通道拆分,且不能同时使能channel_split和NZ2ND功能。
nz2nd_en输入使能NZ2ND开关。
•false:不使能;
•true:使能。
quant_post输入后处理阶段量化参数。取值见功能说明。
relu_post输入后处理阶段使能relu。
clip_relu_post输入后处理阶段使能clip_relu,需搭配normal relu一起使用,且需要使能量化功能。
eltwise_op输入定义数据从l0c搬运至l1时的目的操作数地址和通道步长。
eltwise_antq_cfg输入按位使能元素的反量化操作。
C0_pad_en输入使能为C0配置填充位,C0是通道循环的目标步长数。
broadcast_en输入是否使能广播能力。
•false:不使能;
•true:使能,在数据搬运时沿M轴方向进行数据广播。
NZ2DN_en输入使能NZ2DN开关。
•false:不使能;
•true:使能。

矢量数据寄存器的详细说明请参见reg数据类型定义.md。

返回值说明

流水类型

PIPE_FIX

约束说明

  • src的起始地址要求按照对应数据类型所占字节数对齐。
  • dst的起始地址要求32字节对齐。

调用示例

uint64_t quant_pre = DEQF16; uint64_t quant_post = VQS162B8_POST; // dst src分别对应目的操作数的输出地址和源操作数的输入地址 asc_copy_l0c2l1(dst, src, n_size, m_size, dst_stride, src_stride, clip_relu_pre, unit_flag_mode, quant_pre, relu_pre, channel_split, nz2nd_en, quant_post, relu_post, clip_relu_post, eltwise_op, eltwise_antq_cfg, c0_pad_en);

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

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

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

绝巧弃利之后,ABAP 才回到可升级的常道

老子说「绝圣弃智,民利百倍;绝仁弃义,民复孝慈;绝巧弃利,盗贼无有」。这句话放到 SAP ABAP 开发里,不能理解成不要知识、不要规范、不要技巧。ABAP 项目从来离不开知识,也离不开严密的工程纪律。它真正提醒我们的是,当一个系统过度崇拜个人聪明、过度依赖补救式道德、过…

作者头像 李华
网站建设 2026/5/11 7:39:42

CANN/asc-devkit异或运算API文档

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

作者头像 李华
网站建设 2026/5/11 7:35:33

CANN ops-nn MaxPool3D算子

MaxPool3D 【免费下载链接】ops-nn 本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-nn 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品√…

作者头像 李华
网站建设 2026/5/11 7:25:53

【信息科学与工程学】【人工智能】【数字孪生】【游戏科学】主要数学模型-第九篇 计算神经科学

认知神经科学的几何、拓扑与计算建模框架 这是一个深度交叉领域的问题,我将从几何表示、拓扑结构、动力学模型和仿真算法四个维度,系统梳理从神经元到全脑的计算神经科学建模方法。 一、神经元与连接的几何表示模型 神经元形态的表示: a) 线表示:将神经元的树突和轴突表示…

作者头像 李华
网站建设 2026/5/11 7:24:42

【信息科学工程学】【社会科学】 第五十五篇 人的利益规则05——行业篇02

编号 行业门类 细分子行业和细分公司类型 行业的上游 行业的下游 产品的上游 产品的下游 利益形态(与各主体) 各类利益形态和利益模型(含周期性) 利益流动模式 人的利益规则 公司内的利益规则 公司间的利益规则 各类利益链和利益流动链条的数学建模框架 行业…

作者头像 李华
网站建设 2026/5/11 7:17:33

DISTINCT 带 WHERE 仍全表扫描?两层优化刀法拆解

DISTINCT 带 WHERE 仍全表扫描?两层优化刀法拆解 引言:一个看似多余的 DISTINCT,藏着性能陷阱 几乎每个写过 SQL 的人都用过 DISTINCT。它的语义很简单——去掉重复行。但"简单"不等于"快"。在一个客户的生产环境中&…

作者头像 李华