You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CUDA矩阵转置中合并访问下全局加载事务多于存储事务的疑问

矩阵转置中全局加载/存储事务数差异的原因分析

针对你观察到的gld_transactions_per_request=16远高于gst_transactions_per_request=4的现象,结合你的GTX 1050 Mobile(Pascal架构)环境和矩阵转置场景,核心原因如下:

1. Pascal架构的事务合并硬件差异

Pascal架构对全局内存的加载和存储请求采用不同的合并规则:

  • 存储请求:当存储地址连续时,硬件会将整个warp的32个int存储请求合并为4个32字节的事务(正好对应你看到的gst_transactions_per_request=4),合并效率极高。
  • 加载请求:若你的转置代码使用了非32×32的块大小(比如16×16),一个warp会包含来自原矩阵多行的线程(例如16×16块中,一个warp覆盖2行×16列的线程)。这些线程访问的原矩阵地址间隔为12800×4=51200字节,远大于128字节的缓存线大小,无法合并为少数事务。最终每个warp的加载请求会拆分为16个独立的32字节事务,对应gld_transactions_per_request=16。

2. L1缓存的交互逻辑差异

Pascal的L1缓存对加载和存储的处理逻辑不同:

  • 加载:采用回写模式,若加载的缓存线未命中L1,需要从全局内存加载完整的128字节缓存线。如果矩阵访问模式导致L1缓存命中率低,会进一步增加全局加载事务数。
  • 存储:采用写直达模式,直接写入L2缓存,无需经过L1的额外处理,事务粒度更集中,因此事务数更少。

验证与优化建议

  • 调整块大小:将转置核的块大小改为32×32,此时每个warp的加载请求对应原矩阵连续的32个int,可合并为4个32字节事务,与存储事务数一致。
  • 确保内存对齐:使用cudaMalloc分配矩阵内存(默认保证256字节对齐),避免因起始地址不对齐导致的跨缓存线额外事务。
  • 优化L1缓存配置:通过编译选项nvcc -Xptxas -dlcm=cg matrix_transpose.cu -o no_bank_conflict将L1缓存设置为只读模式,提升加载请求的合并效率。

内容的提问来源于stack exchange,提问作者Saydon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 06:33:10