CANN 组织链接 : https://atomgit.com/cann
PTO-ISA 仓库链接 : https://gitcode.com/cann/pto-isa
1. PTO-ISA 的定义与硬件抽象层
PTO-ISA 位于 CANN 架构的最底层指令集之上,是 PyPTO 编程范式生成代码的目标汇编或中间表示。它充当了 PyPTO 调度层与底层硬件执行单元之间的桥梁。
1.1 抽象层级:超越传统汇编
PTO-ISA 的指令设计必须高度匹配达芬奇架构的特性,它不是一个通用的 CPU ISA,而是专为张量计算和数据流控制设计的:
- 张量操作指令:指令直接操作块级数据(Tile),而非单个标量。例如,一条 PTO-ISA 指令可能对应于一次完整的本地内存矩阵乘法(MatMulV3 的底层实现)或一个向量化 Softmax 归约。
- 流控制指令:用于管理 DMA 引擎(MTE)和计算单元(Cube/Vector Unit)之间的同步和依赖关系。
1.2 与 Ascend C 的关系
Ascend C 编译器(ascendc)负责将 C++ 代码转换为 PTO-ISA 级别的 IR,然后再转化为最终的机器码。PyPTO 的目标是直接在调度层面生成(或指导生成)与 PTO-ISA 结构高度对齐的 IR,从而最小化编译器的后期优化开销。
2. PTO-ISA 中的内存与数据流指令
PTO-ISA 的核心设计理念是最小化对全局内存的访问,并优化片上数据的周转。
2.1 DMA 事务指令
PTO-ISA 包含专用的指令来控制数据传输:
PTO_DMA_LOAD:显式触发从 Global Memory 到 Local Memory 的块拷贝。指令参数中必须包含全局偏移量、本地目标地址和传输的length(或 Tile 尺寸)。- 数据地址对齐约束:PTO-ISA 指令强制要求源地址和目标地址满足硬件的对齐约束,否则指令执行失败。
2.2 计算单元绑定指令
计算指令直接映射到硬件单元的功能。
- Cube Command:一条指令可能包含多个乘法操作和累加指令,并指定输入数据在 Local Memory 中的精确位置,以确保数据被高效地送入 Cube 单元的寄存器堆。
- 同步原语:指令集中包含对硬件信号量(如队列信号)的操作,用于实现流水线中的生产者-消费者同步,这是实现双缓冲机制的底层基础。
3. 精度与向量化在 ISA 层的体现
PTO-ISA 明确区分了不同精度的操作。
3.1 精度控制
指令集定义了对 FP16、BF16、INT8 等不同数据类型的特定版本操作。例如,PTO_VEC_MUL_FP16 和 PTO_VEC_MUL_INT8 是两条不同的底层指令,具有不同的执行周期和所需的输入格式。
3.2 向量化步长控制
对于 Vector Unit 操作,指令集定义了处理数据的步长。如果硬件支持 128 元素宽度的向量操作,PTO-ISA 中对应的指令将一次性处理 128 个元素的计算,而不是通过软件循环来模拟。
4. 总结
PTO-ISA 是 CANN 算子栈最底层的、面向硬件特性的指令集表现。PyPTO 范式通过高度结构化的调度语言,直接指导编译器生成高效的 PTO-ISA 序列,从而保证了自定义算子能够以最接近硬件峰值性能的方式执行,尤其是在数据流密集型的张量操作中。
CANN 组织链接 : https://atomgit.com/cann
PTO-ISA 仓库链接 : https://gitcode.com/cann/pto-isa