算子优化中的memory coalescing、bank conflict、occupancy分别指什么?
Coalescing:同一 warp 的线程访问 连续地址(如 thread i 访问 addr_base + i)时,硬件可合并成少量(甚至一次)global memory 事务;若线程访问分散或错位,会产生多次事务,带宽利用率低。优化:让 相邻 thread 访问相邻地址(如 threadIdx.x 对应连续下标)、避免随机步长;对 2D/3D 注意 行主序 下把连续维映射到 threadIdx.x。
Shared memory 按 bank 分(如 32 bank、4B 宽);同一 warp 内不同线程访问同一 bank 的不同地址会 bank conflict,访问被串行化。避免方式:padding(在行末加空位使错开 bank)、改变访问模式(如转置用 shared 做分块避免同一 bank 多地址)、或设计成同一 warp 访问同一地址(broadcast,无 conflict)。
Occupancy = 同时驻留的 warp 数 / 硬件最大 warp 数,反映 延迟隐藏 能力。受限于:每 block 的 register、每 block 的 shared memory、每 SM 的 block 上限。register 用得多 → 每 block 能放的 warp 少 → occupancy 低;但有时 少 register、高 occupancy 反而因更多 warp 争抢而变慢。要在 occupancy 与 per-thread 资源 之间做权衡,用 Nsight Compute 看实际 occupancy 与 stall 原因。
| 返回模块 | 返回总览 |