返回题库
简单Attention一面腾讯游戏

FA3和FA2有什么区别

25 0 0

参考答案

## 讲一下FA2和FA3的区别 ### FA2在Ampere 1.所有 warp 干一样的活(homogeneous),__syncthreads() 同步\ 2.用 cp.async 从 gmem 搬 K/V 到 smem:每个线程发自己的那份,128 个线程发 128 条指令\ 3.用 mma.sync.m16n8k16:warp 级、同步指令,A/B 操作数必须先用 ldmatrix 搬进寄存器\ 4.smem 靠 padding 避 bank 冲突\ 5.一个 block 干完一个 tile 就退出 ### FA3 相比 FA2 的技术创新 FA3 的九项改动,按"影响多大"排序: (1) 异步的 warpgroup MMA(wgmma) — 最根本的一条。wgmma.mma_async.m64nNk16 是 128 线程(一个 warpgroup)协作的一条指令,而且 A/B 可以直接从 shared memory 读(SS 模式),不需要 ldmatrix、不占寄存器。更关键的是它异步:发出去之后指令流继续走,要结果时才 warpgroup_wait<N>()。这条是后面 (4)(5) 两项调度优化的前提——没有异步就没有"影子"可以藏东西。 (2) Warp Specialization(生产者/消费者分工) — FA2 里所有 warp 既搬数据又算数;FA3 把 warp 分成两类角色:1 个 producer warpgroup 只负责发 TMA 搬 K/V,2 个 consumer warpgroup 只负责 wgmma + softmax。分工之后可以用 setmaxnreg 重新分配寄存器:producer 只需要少量寄存器(warpgroup_reg_dealloc<24>),把省下来的全给 consumer(warpgroup_reg_alloc<240>),见 hopper/flash_fwd_kernel_sm90.h:86-87。同步从 __syncthreads() 换成 mbarrier / named barrier,只挡该挡的人。 (3) TMA 替代 cp.async — TMA(Tensor Memory Accelerator)是 Hopper 的硬件 DMA 引擎。一个线程发一条 cp.async.bulk.tensor 就把整个 tile 搬完,越界处理、swizzle 还原都由硬件做,不再需要每个线程算自己的地址和写 predicate。还支持 cluster 内多播(一份数据同时进多个 CTA 的 smem)。 (4) IntraWGOverlap — 把 softmax 藏进 wgmma 的影子里。做法是 warpgroup_wait<1>()(不是 <0>):允许"还有 1 批未完成"就返回,于是上一个 tile 的 PV GEMM 还在 tensor core 上跑的时候,SM 的普通 ALU 已经在算这个 tile 的 exp2。指数运算和矩阵乘用的是不同的硬件单元,可以真并行。 (5) Ping-pong 调度 — 两个 MMA warpgroup 轮流占用 tensor core。用一个 named barrier 当"令牌"传递(warp_scheduler_barrier_sync/arrive),保证 WG0 在算 softmax 时 WG1 在用 tensor core,反之亦然。tensor core 的利用率因此不会掉到 50%。 (6) Swizzle 替代 padding — 不是为了省那 2560 字节,是因为 wgmma 和 TMA 的描述符里有 swizzle 字段,硬件自己还原;padding 方案根本喂不进 wgmma。这一条是硬性前提,不是优化。 (7) Thread Block Cluster — Hopper 新增的层级,cluster 内多个 CTA 的 smem 可以互相访问,配合 TMA 多播减少 K/V 的重复搬运。 (8) FP8 支持 — 需要额外做 V 的转置(LDSM.T + byte_perm + STSM)和两级累加(fp8 的 wgmma 累加器精度不够,要定期倒到 fp32),以及 Max_offset=8 的量化偏移技巧。 (9) 持久化 kernel + 动态 tile scheduler — grid = {num_sm},每个 block 长期驻留,用 atomicAdd(tile_count_semaphore) 抢任务。省掉反复的 block 启动/退出,也让长短不一的 causal tile 能自动负载均衡。

讨论区(0)

还没有评论,来做第一个发言的人吧