ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

CANN PTO-ISA 混合精度 Flash Attention 性能 Kernel 实践指南(Ascend A5)

CANN PTO-ISA 混合精度 Flash Attention 性能 Kernel 实践指南(Ascend A5) CANN PTO-ISA 混合精度 Flash Attention 性能 Kernel 实践指南Ascend A5【免费下载链接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.项目地址: https://gitcode.com/cann/pto-isa本文围绕 CANN PTO-ISA 开源仓库中的 A5 平台 Flash AttentionFA手工 Kernel 示例展开介绍其工程结构、构建与运行方式、性能指标定义以及基于数值稳定 tiled softmax 的四阶段实现compute_qk / compute_p / compute_pv / compute_gu与 Cube/Vector 软件流水线编排并结合源码说明 A5 特有的 UB 路径优化与调参手段。读完本文你将掌握如何在 A5Ascend910_9599上构建、运行、调参与验证一个混合精度的 Flash Attention 性能 Kernel。概览与应用场景本示例演示如何使用 PTOParallel Tile OperationAscend CANN 设计的一种面向 tile 级操作的虚拟指令集架构在 Ascend A5 平台上实现混合精度的 Flash AttentionFA算子。所谓混合精度指的是输入 Q/K/V 以 FP16 存放而中间结果QK 累加、Softmax 归一化、PV 累加以 FP32 计算最终输出 O 可回落到 FP16/FP32兼顾精度与吞吐。该 Kernel 位于 kernels/manual/a5/flash_atten/是仓库中 kernels/manual/common/flash_atten/ 通用版 Flash Attention 示例的 A5 专用版本。通用版本文档描述了 FA 的数学原理、分块计算策略与流水线编排支持 A2/A3而 A5 版本在其基础上针对 A5 架构的内存层次、Cube/Vector 同步机制与流水线深度进行了适配与优化。本文涉及的全部源码与配置均可从当前仓库对应路径查看适合从事算子开发、性能优化与内核研究的开发者阅读。目录结构与工程组成A5 版本示例的工程结构如下与仓库 kernels/manual/a5/flash_atten/ 一致kernels/manual/a5/flash_atten/ ├── scripts/ │ ├── gen_data.py # 生成输入与 golden 输出 │ ├── generate_cases.py # 生成测试用例host/kernel 共用的 case 配置头与 JSON │ ├── pipeline_log_analysis.py # 流水线日志分析 │ ├── pipeline_schedule_gen.py # 流水线调度生成 │ ├── run_timeline.sh # 时间线分析脚本 │ └── validate_buffer_usage.py # 校验所有生成 case 的 buffer 用量 ├── CMakeLists.txt # 构建配置 ├── fa_performance_kernel.cpp # Kernel 实现compute_qk/compute_p/compute_pv/compute_gu ├── fa_performance_kernel.h # Kernel 头文件模板参数与默认调优常量 ├── main.cpp # Host 侧入口case 分发、数据搬运、校验与性能统计 ├── pto_macro_fa_gu.hpp # FA GU归约/归一化宏定义 ├── pto_macro_fa_softmax.hpp # FA SoftmaxTSOFTMAXFA宏定义 ├── pto_macro_matmul.hpp # Matmul 宏定义 └── run.sh # 便捷脚本一键生成 case、构建、运行与通用版A2/A3相比A5 版本额外提供了 DN 变体目录中还包含fa_performance_dn_kernel.cpp、pto_macro_dn_matmul.hpp、pto_macro_fa_dn_gu.hpp、pto_macro_fa_dn_softmax.hpp通过run.sh --mode_dn启用详见下文“DN 模式”说明。Host 侧入口main.cpp 是一个独立驱动不依赖 gtest核心流程为读取generate_cases.py生成的generated_cases.h通过TFA_FOR_EACH_CASE宏实例化所有模板 caserun_casefloat, S0, HEAD, S1, CUBE_S0, CUBE_S1, TILE_S1, QK_PRELOAD, CAUSAL_MASK根据--case/--cases/--npu/--intermediate/--sys_cnt_multiple等命令行参数过滤与选择要运行的 case为每个 case 分配 device 侧 FIFO 缓冲qk_tile_fifo、p_tile_fifo、pv_tile_fifo、exp_max_ififo、o_out、o_parts 等并写出device_addrs.toml供时间线分析脚本使用调用模板化的LaunchTFA...启动 Kernel将中间 FIFO 数据拷回 host与 golden 文件比对基于 profiling 数据统计Total task time (us)与TFLOPS追加写入report.csv最终打印test success或test failed。Kernel 侧入口fa_performance_kernel.h 定义了 Kernel 的模板参数与默认常量constexpr int kFaCvFifoSize 8; // Cube/Vector 间 FIFO 深度 constexpr int kFaCvFifoConsSyncPeriod 4; // 消费同步周期FIFO 深度的一半 constexpr int kFaCubeS1 128; // Cube matmul 在 S1 维的 tile 尺寸 constexpr int kFaTileS1 256; // 逻辑 S1 tile 尺寸 constexpr int kFaQkPreload 4; // QK 预取preload深度 constexpr int VEC_CORES 2; // Vector 子块数S0 行在 vector subblock 间切分这些常量会在后文“调参点”与“流水线编排”中反复出现是理解 Kernel 行为的钥匙。构建与运行环境准备运行前需要先配置 Ascend CANN 环境示例路径请替换为实际安装路径source ${ASCEND_INSTALL_PATH}/bin/setenv.bash构建时 CMake 会校验ASCEND_HOME_PATH环境变量CMakeLists.txt 中通过message(FATAL_ERROR ...)强制要求因此务必先执行环境变量脚本。编译器使用 bishengKernel 侧通过--cce-pto-enable开启 PTO 支持并指定 A5 架构--cce-aicore-archdav-c310。一键运行run.sh进入示例目录后即可运行cd ${git_clone_path}/kernels/manual/a5/flash_atten # 运行默认 case与 generated_cases.* 中内置集合一致 bash run.sh -r npu -v Ascend910_9599 # 从内置集合中只运行一个 case bash run.sh -r npu -v Ascend910_9599 -c case_float_H_128_S0_128_S1_1024 # 提供自定义 case用分号分隔HEAD_SIZE,S0,S1,CUBE_S0,TILE_S1 # TILE_S1支持 128CUBE_S1、256、512 bash run.sh -r npu -v Ascend910_9599 --cases 128,128,1024,128,128;128,2048,2048,128,512 # 提供自定义 case并只运行其中一个 bash run.sh -r npu -v Ascend910_9599 --cases 128,128,1024,128,128;128,512,2048,128,128 \ -c case_float_H_128_S0_128_S1_1024成功时输出test success注意该目录仅支持 A5 平台。run.sh会校验 SoC 版本必须匹配Ascend910_9599前缀否则直接报错退出pattern^Ascend910_9599 if [[ ! $SOC_VERSION ~ $pattern ]]; then echo [ERROR] Unsupported SocVersion: ${SOC_VERSION}, this folder only support A5. exit 1 firun.sh 完整参数说明通过阅读 run.sh 的 getopt 解析逻辑可以整理出以下完整参数表短选项长选项取值说明-r--run-modenpu/sim等运行模式npu为板上运行链接runtimesim为仿真链接runtime_camodel见 CMakeLists.txt 的target_link_libraries分支-v--soc-versionAscend910_9599SoC 版本仅支持 A5-n--npu设备号NPU 设备 ID默认0-c--casecase 名或数值元组只运行指定 case如case_float_H_128_S0_128_S1_1024-a--cases分号分隔的元组列表自定义 case 集合格式HEAD_SIZE,S0,S1,CUBE_S0[,TILE_S1]-p--qk-preload整数QK 预取深度默认2对应 Kernel 侧默认QK_PRELOAD4的生成脚本默认值不同生成脚本默认4run.sh未传时用2注意区分-m--mode0/1/2FIFO 模式0ALL_GM_PATH、1ALL_UB_PATH、2QK_PV_UB_ONLY默认1见下文“A5 平台特定优化”-i--intermediate-开启中间结果FIFO校验-d--debug-调试构建-DDEBUG_MODEON并追加--cce-enable-print编译选项-k--mask-开启 causal mask--causal-mask 1---mode_dn-启用 DN 变体编译并运行fa_performance_dnrun.sh的内部流水为generate_cases.py生成 case →validate_buffer_usage.py校验 buffer 用量 → CMake 配置含-DFIFO_MODE、-DDEBUG_MODE、-DMODE_DN等编译宏→make→gen_data.py生成输入与 golden → 运行./fa_performance或./fa_performance_dn。运行参数--sys_cnt_multiple1.0用于将硬件 cycle 计数换算为时间。自定义 case 的约束规则generate_cases.py 对 case 做了严格的合法性归一化自定义 case 必须满足元组格式为HEAD_SIZE,S0,S1,CUBE_S0[,TILE_S1]4 或 5 个逗号分隔值CUBE_S1固定为128且S1必须能被CUBE_S1整除TILE_S1必须是CUBE_S1的整数倍且S1必须能被TILE_S1整除默认TILE_S1128即每 tile 一个 cube 块CUBE_S0不能超过S0且必须整除S0否则自动回退为CUBE_S0 S0qk_preload 1。默认内置 case 集合为HEAD_SIZES0S1CUBE_S0TILE_S1128128102412812812812820481281281281288192128128128512102412812812851220481281281285128192128128case 命名规则为case_float_H_{HEAD}_S0_{S0}_S1_{S1}例如case_float_H_128_S0_128_S1_1024。性能指标定义与参考数据指标定义本目录性能统计沿用了通用版本文档的定义S0query 序列长度Q/O 的行数S1key/value 序列长度K/V 的行数Total task time (us)每个 task 的端到端 kernel 时间微秒GOps该 task 计数的总运算量。Host 侧计算式为S0 × S1 × HEAD_SIZE × 4 / 1e6见 main.cpp 中gops的计算对应 QK 与 PV 两次 matmul 的乘加操作TFLOPSGOps / time。时间数据来源于 Kernel 的 profiling 缓冲kFaProfileBytesPerBlock 1024 * 3cube 两个 vec subblock每个 block 取 cube 与 vec 的时间戳首尾包络作为该 block 的起止时间最终以所有 block 的时间包络计算总时长。A5 实测性能参考以下数据在 Ascend A5 上测得表格中的 TBD 表示待测量数据当前仓库尚未填充CoresS0S1Total task time (us)GOpsTFLOPS11281024TBD67.11TBD11282048TBD134.22TBD11284096TBD268.44TBD作为参考通用版A2/A3kernels/manual/common/flash_atten/README_zh.md 给出了完整的实测数据其中 1 核、S0128 时各 S1 的 TFLOPS 约为 1.59S11024到 7.20S18192归一化吞吐随 S1 增大而明显提升。该文档还指出仿真simulation数值可能显著高于板上实测因为模拟器不会建模所有硬件争用/时延特性性能决策请以板上数据为准。A5 上的具体性能表现以本目录后续更新的实测为准。算子实现原理1. 计算流程FlashAttention 2.0令 Q ∈ ℝ^{S0×H}、K ∈ ℝ^{H×S1}、V ∈ ℝ^{S1×H}其中 H 为HEAD_SIZE。单头 attention 的标准形式省略 softmax 常数项为$$\text{QK} Q K^\top \in \mathbb{R}^{S0\times S1}$$ $$P \operatorname{softmax}!\left(\frac{\text{QK}}{\tau}\right)\in \mathbb{R}^{S0\times S1}$$ $$O P,V \in \mathbb{R}^{S0\times H}$$为降低显存占用并提升访存效率QK 与 softmax 按 (S0, S1) 分块tile流式计算并在遍历 S1-tiles 的过程中持续更新输出 O 的 running sum。缩放系数 $s 1/\sqrt{\mathrm{HEAD_SIZE}}$。数值稳定的 tiled softmax按 S1 分块对每一行 i处理当前 tile 时做如下递推与常见数值稳定 softmax 写法等价步骤 1local row max$m_i \max_j X_{ij}$对应local_max步骤 2updated global max$M_i \max(M_{\mathrm{prev},i}, m_i)$对应new_global_max步骤 3rescaling factor$\mathrm{exp_max}i \exp(s \cdot (M{\mathrm{prev},i} - M_i))$对应l1_exp_max当全局 max 增大时用于重标定历史累加项步骤 4per-element exponentials$e_{ij} \exp(s \cdot (X_{ij} - M_i))$对应p_tile_fp32/x_expx_exp会 cast 为 fp16 供后续 matmul步骤 5local sum$\ell_i \sum_j e_{ij}$对应local_sum步骤 6updated global sum$S_i \mathrm{exp_max}i \cdot S{\mathrm{prev},i} \ell_i$对应l2_global_sum。处理完所有 tiles 后得到最终 softmax 概率 $p_{ij} e_{ij} / S_i$。Kernel 会保存x_exp供compute_pv使用同时保留l1_exp_max与l2_global_sum供compute_gu做 running 累加与最终归一化。2. 张量形状按阶段输入QS0 × HEAD_SIZEfp16KS1 × HEAD_SIZEfp16VS1 × HEAD_SIZEfp16每个 S1 tile 的中间量tile tqk_tileS0 × CUBE_S1fp32 累加例如64×128/128×128p_tilex_expS0 × CUBE_S1fp16用于 matmulpv_tileS0 × HEAD_SIZEfp32每个 tile 的部分结果输出OS0 × HEAD_SIZEfp16/fp323. 分阶段实现与调参Kernel 核心代码分为四个阶段在 fa_performance_kernel.cpp 中实现源码注释将其概括为跨核流水线compute_qk (Cube) → qk_tile_fifo → compute_p (Vec) → p_tile_fifo → compute_pv (Cube) → pv_tile_fifo → compute_gu (Vec) → o_out。compute_qkCube matmul作用计算单个 S1 tile 的 Q·K_tcube pipeline。实现要点Q tile 做 leftTile 驻留——当tile_idx 0时加载一次 Q后续 tiles 只加载 K减少从 GM 的重复读取qk 部分结果写入紧凑的 ping/pong 全局缓冲复用matmul_macro_ptomatTile → accTile并维护 left/right tiles 的 ping/pong 状态。调参点assign_running_acc_tile让输出 accTile 在compute_qk与compute_pv之间双缓冲qkPreloadNum同时决定qkp_tile_fifo_size 1 qkPreloadNum用于 cube 生产者与 vector softmax 消费者之间的 FIFO 深度。compute_pVector softmaxTSOFTMAXFA作用在 S1 维度按 tile 增量计算并保持数值稳定的 tiled softmax。实现要点Vector tilingVec_S0 S0 / VEC_CORES每个 vector subblock 处理Vec_S0 × CUBE_S1VEC_CORES控制 S0 行在 vector subblock 间的切分A5 版本默认VEC_CORES 2每个 vector core 用get_subblockid()计算全局张量 load/store 的 tile 索引与 qk/p/pv/o buffer 偏移自然形成 SPMD 并行TSOFTMAXFA微内核定义于 pto_macro_fa_softmax.hpp负责 softmax 递推保存每个 tile 的l1_exp_max与l2_global_sum供compute_gu做 running 累加并在最后一步计算最终 O。实现取舍优先使用固定 tile 尺寸的TROWMAX/TROWSUM128/256/512/1024 reduce 轴上的实现通常更高效对动态有效行/列可先做TFILLPADPAD_MIN/-INF把动态 mask 转成静态例如处理动态 S0TROWEXPANDSUB支持原地计算dstsrc可减少临时 buffer。UB 分配allocate_vec_tile_buffers为compute_p/compute_gu的 per-vector tiles 预先规划 UB 偏移让 vector cores 复用一小组固定 UB 地址。常用参数为SrcBuffers、XexpBuffers、pvVecBuffers、ExpMaxBuffersExpMaxBuffers通常等于qkp_tile_fifo_size。典型分配顺序qkvec tiles →m1_local_max→m2_global_max→input_reduce_tmp→l1_local_sum→l2_global_sum→l1_exp_max[]→x_exp[]→runningOTile。compute_pvP·V matmul作用把每个 tile 的 Psoftmax 输出与对应的 V tile 相乘得到 PV 的部分累加cube matmul 风格。实现要点加载 V tile 与 P tile并把pv_tile_fifo写入全局 float buffer 的 per-tile ping/pong 缓冲。调参点pv_tile_fifo_size通常为1 qkPreloadNum控制 P 生产与 GU 消费之间的 FIFO 深度。compute_gu归约 / 归一化作用消费pv_tile_fifo并累加到runningOTile最后一个 tile 触发对l2_global_sum的最终除法得到输出 O。实现要点vector core 驱动使用TGU_ND/TGU_LAST_ND宏定义于 pto_macro_fa_gu.hpp做 per-tile 累加。实现取舍保持runningOTile绑定assigned避免重复分配TROWEXPANDMUL/TROWEXPANDDIV支持原地计算dstsrc可减少临时 buffer。4. 流水线编排Cube/Vector 并行跨阶段通过 CV FIFO 阶段内 ping/pong 做软件流水化。S1 tiles 循环中的典型流程cubecompute_qk预加载下一批 QK tile并通过 flag 通知 vectorvectorcompute_p等待 qk 就绪在该 chunk 上运行TSOFTMAXFA产出 p tile并通知 pv 消费者cubecompute_pv消费 p 与 v生成pv_tile_fifo写回全局并通知 GU 消费者vectorcompute_gu消费pv_tile_fifo并累加到runningOTile。阶段内关键机制matmul_macro_ptoassign_running_acc_tileleftTile/rightTile/AccTile 的双缓冲使 cube core 能在 preload 序列里交错compute_qk与compute_pvcompute_p的 qk 输入与 p 输出也做双缓冲expT提供多 preload buffer支持更晚的结果转发。同步机制A5 版本使用 FFTSflag-based同步。Kernel 源码中定义了FftsBufferFlag枚举fa_performance_kernel.cppenum FftsBufferFlag : uint32_t { BUF0_QK_READY 0, // qk2smSyncQK 就绪 BUF1_SM_READY 2, // sm2pvSyncSoftmax 就绪 UPDATE_READY 4, // pv2guSyncPV 就绪 UB_BUF_READY 6, // ubBufSyncUB 缓冲就绪 PV_UB_BUF_READY 8, // pvUbBufSyncPV UB 缓冲就绪 CV_BLOCK_END 10, // CV comm slot block end };每个TSync对象使用两个连续 flag前向 record/wait 与反向 allocate/free因此 flag ID 间隔 2 以避免冲突双核two vec subblock场景使用16的偏移。消费同步通过should_wait_consumption/should_notify_consumption模板按周期kFaCvFifoConsSyncPeriod kFaCvFifoSize / 2发信号并在 Kernel 尾部用pending_consumption_events排空尚未等待的消费通知。调参入口knobsqkPreloadNum允许 cube pipeline 预先产出更多 QK tilesqkp_tile_fifo_sizeqk/p FIFO 深度通常为1 qkPreloadNumpv_tile_fifo_sizePV FIFO 深度通常与 qk FIFO 深度匹配用于与 GU 重叠同步优先用轻量 device flags在 UB 允许时尽量用更深的 FIFO/更大的 preload 拉开重叠。以 Head128、S0128、S11024 为例CUBE_S1128 时共有 4 个 loop每个 loop 执行compute_qk → compute_p → compute_pv → compute_gu。不做预执行preload时四段趋向串行增大qkPreloadNum后 cube pipeline 可以“跑在前面”把 vector 侧资源摊平从而隐藏等待延迟。通用版本文档中还指出从流水线图可以看到瓶颈更偏向 cube 侧的TSTORECube 利用率约 30%后续优化会优先围绕这一点展开。5. 多核切分与负载均衡多核 tilingQKV 输入是 BNSDBatch、Head 数、Seqlen、HEAD_SIZE布局计算过程中产生中间的 QK(S0,S1)。由于 S1 是归约轴多核切分通常按 (B, N, S/Cube-S0) 分在 Flash-decoding 场景中 (B, N, S/Cube-S0) 较小未来可以考虑沿 S1 轴切分每核保留部分 O再通过另一个 kernel 做最终 GU通用版本文档标记为 TODO。对很大的 S0超过最大物理核数时中间 FIFO buffer 可能引入浪费与不必要的 L2 回写可按 core id 做进一步优化TODO。负载均衡引入 causal attention mask 时需要考虑稀疏性TODO多核 tiling 也要关注沿 S0 轴的负载不均。当前做法是在大 S0 时采用 block 数大于物理核数的多 block 启动方式。A5 平台特定优化相比 A2/A3 平台A5 版本的 Flash Attention kernel 针对 A5 架构特点进行了以下优化针对 A5 的内存层次结构调整了缓冲区分配策略优化了 Cube 和 Vector 核心之间的同步机制使用前述 FFTS flag 同步体系调整了流水线深度参数以适配 A5 的硬件特性kFaCvFifoSize 8、kFaQkPreload 4、kFaTileS1 256等默认常量。FIFO 路径模式FIFO_MODEA5 版本的核心优化之一是UB/L1 直传路径通过编译宏FIFO_MODE选择数据在 Cube/Vector 之间传递的媒介源码注释见 fa_performance_kernel.cpp 顶部以及 CMakeLists.txt 的UB Path Mode ConfigurationMODE 0ALL_GM_PATH所有数据路径走 Global MemorybaselineQKL0C → GM → UBTSTORE/TLOADPUB → GM → L1TSTORE/TLOADPVL0C → GM → UBTSTORE/TLOADMODE 1ALL_UB_PATH所有数据路径使用 UB/L1 直接传输无 GM 往返QKL0C → UBTMOVPUB → L1TMOV ND2NZ TINSERTPVL0C → UBTMOVMODE 2QK_PV_UB_ONLYQK 与 PV 走 UB 路径P 路径回退 GMQKL0C → UBTMOVPUB → GM → L1TSTORE/TLOAD无 TMOVTINSERTPVL0C → UBTMOV通过run.sh -m或-DFIFO_MODE切换run.sh默认1Kernel 源码默认2。源码还对模式做了合法性校验FIFO_MODE必须为 0/1/2且 MODE 1/2 要求UF_ENABLE 0#error拦截非法组合。三种模式体现了“GM 兜底 → 全 UB 直传 → 部分 UB 直传”的递进优化思路UB/L1 直传省去 GM 往返的 TSTORE/TLOAD可显著降低 FIFO 搬运开销但对 buffer 规划与同步精度的要求更高。DN 模式run.sh --mode_dn编译并运行fa_performance_dn变体DN 布局对应源码为 fa_performance_dn_kernel.cpp 及pto_macro_dn_matmul.hpp、pto_macro_fa_dn_gu.hpp、pto_macro_fa_dn_softmax.hpp。DN 与 ND 的主要差异在 tile 的数据排布从 main.cpp 的中间结果校验逻辑可见DN 构建将 qk/p subtile 按(Cube_S1 × Cube_S0)排布ND 构建按(Cube_S0 × Cube_S1)排布#ifdef MODE_DN分支。此外DN 变体通过--causal-mask支持 causal attention mask 的中间校验跳过逻辑skip_for_causal_mask。Causal Maskrun.sh -k--causal-mask开启 causal mask 支持mask 状态会随 case 配置写入generated_cases.h/JSON并作为模板参数CAUSAL_MASK参与 Kernel 实例化与 host 校验。中间校验中当s1_index s0_index的 tile 会被跳过causal 下该区域被 mask 掉。调试与验证手段中间结果校验--intermediate默认运行只做最终 O 的 golden 比对容差 1e-3。加上-i--intermediate后host 会额外比对各阶段的 FIFO 中间数据qk_fifo、p_fifox_expfp16、p_max_fifoexp_max、pv_fifo按 block 逐 tile 与 golden 比对容差 exp_max 为 1e-2、其余为 1e-3global_sum_part{t}_out.bin、exp_max_part{t}_out.bin逐 tile 的 per-tile 全局和与 exp_max 快照o_part{t}_out.bin每迭代的 running 输出快照。校验结果以[CHECK] block b qkOK/FAIL p... p_max... pv...形式输出最终汇总为[CHECK] FIFO intermediate ok/failed并可通过--sys_cnt_multiple调整时间换算系数默认 A2/A3 为 20.0run.sh传入1.0。时间线分析目录提供流水线时间线分析工具链scripts/pipeline_log_analysis.py解析 device 侧指令日志instr_popped_log.dump/instr_log.dump与 device_addrs.tomlmain.cpp 运行时生成输出timeline.csv/timeline.json/timeline_agg.csv/timeline.svgscripts/pipeline_schedule_gen.py生成流水线调度示意scripts/run_timeline.sh一键执行上述分析需要先以 debug 模式构建产生指令日志。Buffer 用量校验scripts/validate_buffer_usage.py 在构建前对generated_cases.json中所有 case 的 UB/L1 buffer 用量做静态校验--mode dn/--mode nd确保配置在硬件容量约束内避免运行期溢出。参考与延伸通用版 Flash Attention 文档A2/A3含完整的数学推导、张量形状、分阶段实现与实测性能表kernels/manual/common/flash_atten/README_zh.mdKernel 实现与调优注释fa_performance_kernel.cppHost 驱动与校验逻辑main.cpp一键构建运行脚本run.shcase 生成与约束规则scripts/generate_cases.py时间线分析脚本scripts/run_timeline.shPTO 虚拟指令集的整体介绍可参考 docs/PTOISA_zh.md指令集手册见 docs/PTO-Virtual-ISA-Manual_zh.md。A5 平台的调优参数与性能数据将在后续版本中持续更新建议以当前仓库实际内容为准。【免费下载链接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.项目地址: https://gitcode.com/cann/pto-isa创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表