非连续读写性能差异:CPU与GPU矩阵转置行为对比及原因探究
为什么CPU上超出缓存的大矩阵连续读转置性能更优?
核心原因在于CPU与GPU内存子系统的设计差异,以及两种转置模式下内存访问的效率差异,具体可拆解为以下几点:
1. CPU硬件预取器对连续读的针对性优化
CPU的内存子系统严重依赖硬件预取器掩盖内存访问延迟。当采用**连续读(按行读取原矩阵)**模式时,预取器能精准预测后续内存地址,提前将下一段连续的矩阵行数据加载到L2/L3缓存中——即便矩阵尺寸超出缓存容量,持续的预取操作也能让大部分读操作直接命中缓存或接近缓存级延迟,大幅降低读等待时间。
而在**大步长读(按列读取原矩阵)**模式下,每次读操作的地址跳步等于矩阵维度(如N×N矩阵每次跳N个元素),这种非连续访问完全超出CPU硬件预取器的预测能力,几乎每一次读请求都要直接从主内存获取数据,内存延迟无法被掩盖,直接成为性能瓶颈。
2. CPU写操作的开销影响远低于读操作
两种模式的写操作差异对性能的权重远小于读操作:
- 连续读+大步长写模式中,虽写入是按列的大步长操作,会触发较多**缓存行所有权获取(RFO)**操作(需先读取对应缓存行才能写入),但读操作的高效已让整体流水线保持较高利用率,写操作的开销被读的高效掩盖。
- 大步长读+连续写模式中,即便连续写可利用CPU的**写合并(Write Combining)**特性提升带宽,但读操作的高延迟已拖慢整个流程,写操作的优势无法发挥。
3. CPU与GPU内存子系统的本质设计差异
GPU(如CDNA2架构的MI250X)结果相反,核心原因是:
- GPU内存子系统为高并行度设计,支持对大步长访问的批量合并处理:当多个线程同时按列读取时,GPU内存控制器可将分散请求合并为少量内存块访问,抵消大步长读的延迟。
- GPU的写带宽利用率更高,连续写模式能充分发挥其内存带宽优势,而CPU单线程的写带宽本身就低于读带宽,连续写的收益有限。
你测试中质数/非2的幂次矩阵也符合规律,说明该特性与矩阵尺寸的对齐性无关,完全由内存访问模式和硬件子系统的设计逻辑决定。
内容的提问来源于stack exchange,提问作者Etienne M
相关产品推荐
相关产品推荐

