【问题标题】:CUDA bank conflict for L1 cache?L1缓存的CUDA银行冲突?
【发布时间】:2013-02-07 02:27:30
【问题描述】:
在 NVIDIA 的 2.x 架构上,每个 warp 具有 64kb 的内存,默认情况下划分为 48kb 的共享内存和 16kb 的 L1 缓存(服务于 global 和 constant 内存)。
我们都知道访问共享内存的存储区冲突——内存被分成 32 个 32 位大小的存储区,以允许所有 32 个线程同时独立访问。另一方面,全局内存虽然慢得多,但不会发生存储库冲突,因为内存请求是通过 warp 合并的。
问题:假设一些来自全局或常量内存的数据被缓存在给定 warp 的 L1 缓存中。对这些数据的访问是否会受到存储冲突的影响,例如共享内存(因为 L1 缓存和共享内存实际上是相同的硬件),还是像全局/常量内存那样没有存储冲突?
【问题讨论】:
标签:
cuda
opencl
gpu
nvidia
bank-conflict
【解决方案1】:
在 NVIDIA 的 2.x 架构上,每个 warp 有 64kb 的内存,即
默认分区为 48kb 共享内存和 16kb 一级缓存
计算能力 2.x 设备的每个流式多处理器 (SM) 具有 64 KB 的 SRAM,可配置为
- 16 KB L1 和 48 KB 共享内存,或
- 48 KB L1 和 16 KB 共享内存。
(服务全局和常量内存)。
加载和存储到全局内存、本地内存和表面内存通过 L1。对常量内存的访问通过专用的常量缓存。
我们都知道访问共享内存的银行冲突 -
内存分为 32 个大小为 32 位的组,以允许同时
所有 32 个线程的独立访问。另一方面,全球
内存虽然慢得多,但不会遇到存储库冲突,因为
内存请求通过 warp 合并。
通过 L1 访问全局或本地内存是按高速缓存行 (128 B) 完成的。当向 L1 发出加载请求时,LSU 需要执行地址发散计算以确定哪些线程正在访问同一缓存行。然后 LSU 单元必须执行 L1 缓存标记查找。如果该行被缓存,则将其写回寄存器文件;否则,请求被发送到 L2。如果 warp 有请求未服务的线程,则请求重播并使用剩余线程重新发出操作。
warp 中的多个线程可以访问缓存行中的相同字节而不会引起冲突。
问题:假设一些来自全局或常量内存的数据被缓存了
在给定 warp 的 L1 缓存中。
常量内存不缓存在 L1 中,而是缓存在常量缓存中。
对该数据的访问是否会受到存储冲突的影响,例如共享内存
(因为L1 Cache和hared Memory其实是一样的
硬件),还是像 global/Constant 那样无银行冲突
内存是?
L1 和常量高速缓存一次访问一个高速缓存行,因此没有存储库冲突。