| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 1 个月前 |
02 — 框架自动插入流水同步的 Add 算子
概述
本样例介绍了通过 Ascend C 框架(TPipe/TQue)自动插入流水同步的 Add 算子实现:两个向量 x 和 y 的逐元素加法 z = x + y。计算过程中的流水同步通过 Ascend C 框架自动实现,将数据搬运和计算拆分为 copy_in、compute、copy_out 三个子函数,通过 TQue 的 enque/deque 操作自动保证流水同步,适合学习 Ascend C 框架编程模式。
运行环境要求
| 类别 | 要求 |
|---|---|
| AI 处理器 | Ascend 910B / 910C |
| CANN 版本 | 社区版 8.5.0.alpha001 及以上 |
| Python | 3.9 ~ 3.12 |
| PyTorch | 2.7.1 |
| torch_npu | 7.3.0 |
注意:
- 样例支持NPU上板运行(需要NPU硬件)和仿真器模式(不需要NPU硬件)两种运行方式。仿真器模式运行方式,请参考运行环境变量配置完成配置。
- PyTorch和torch_npu的安装,请参考样例运行验证。
样例规格
| 参数名称 | 输入/输出 | Shape | 数据类型 | 格式 |
|---|---|---|---|---|
| x | 输入 | [8, 2048] | float32 | ND |
| y | 输入 | [8, 2048] | float32 | ND |
| z | 输出 | [8, 2048] | float32 | ND |
样例实现
整体流程
Global Memory (x_gm, y_gm)
│ copy_in: data_copy → TQue.enque
▼
TQue (in_queue_x, in_queue_y)
│ compute: TQue.deque → add → TQue.enque
▼
TQue (out_queue_z)
│ copy_out: TQue.deque → data_copy
▼
Global Memory (z_gm)
关键步骤
- copy_in — 使用
asc.data_copy将输入从 Global Memory 搬运到 Local Memory,然后通过enque将 Tensor 推入队列。计算过程中的 Local Memory 通过TQue.alloc_tensor接口获取。 - compute — 从队列中
deque取出 Tensor,调用asc.add执行逐元素加法,结果通过enque推入输出队列,最后free_tensor释放输入 Tensor。 - copy_out — 从输出队列
deque取出结果 Tensor,通过asc.data_copy搬运回 Global Memory,最后free_tensor释放。
在此过程中,Ascend C 框架会自动插入对应的同步事件,无需调用 set_flag/wait_flag 设置同步。
核心接口
| 接口 | 用途 |
|---|---|
asc.TPipe |
统一管理 Device 端内存和同步事件资源,一个 Kernel 函数必须且只能初始化一个 TPipe 对象 |
asc.TQue |
管理流水任务之间的队列通信和同步,支持 alloc_tensor / enque / deque / free_tensor 操作 |
asc.data_copy |
数据搬运(Global Memory↔Local Memory),支持多种搬运场景 |
asc.add |
按元素求和 |
asc.get_block_idx |
获取当前核的索引,用于多核切分 |
分块、多核、流水线逻辑
- 多核切分
- 使用
USE_CORE_NUM = 8个核并行计算。 - 总数据
total_length按核数等分为block_length = (total_length + USE_CORE_NUM - 1) // USE_CORE_NUM。 - 每个核通过
asc.get_block_idx() * block_length计算自己在 Global Memory 中的偏移量。
- 使用
- 分块计算
- 每个核内部将数据进一步切分为
TILE_NUM = 8个 tile。 - 采用双缓冲机制(
BUFFER_NUM = 2),tile_length = block_length // TILE_NUM // BUFFER_NUM。
- 每个核内部将数据进一步切分为
- 流水线同步
- 本样例使用 Ascend C 框架自动同步方式。TPipe 通过 init_buffer 接口为 TQue/TBuf 分配内存,在 enque/deque 操作过程中自动插入对应的同步事件。
编译执行
环境配置请参考quick_start.md。完成环境配置后,执行如下命令可进行功能验证。
cd pyasc/examples/02_add_framework
python3 add_framework.py -r [RUN_MODE] -v [SOC_VERSION]
其中脚本参数说明如下:
- RUN_MODE:编译执行方式,可选择NPU仿真,NPU上板,对应参数分别为[Model/NPU]。
- SOC_VERSION:昇腾AI处理器型号,如果无法确定具体的[SOC_VERSION],则在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,在查询到的"Name"前增加Ascend信息,例如"Name"对应取值为xxxyy,实际配置的[SOC_VERSION]值为Ascendxxxyy。
示例如下,Ascend910B1请替换为实际的AI处理器型号。
# 仿真器模式
python3 add_framework.py -r Model -v Ascend910B1
# NPU 上板模式
python3 add_framework.py -r NPU -v Ascend910B1
执行成功后输出:
[INFO] start process sample add_framework.
[INFO] Sample add_framework run success.