在 NVIDIA 的 2.x 架构上,每个 warp 有 64kb 的内存,默认情况下划分为 48kb 的共享内存和 16kb 的 L1 缓存
计算能力 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 中的多个线程可以访问缓存行中的相同字节而不会引起冲突。
问题:假设来自全局或常量内存的一些数据缓存在 L1 缓存中,用于给定的 warp。
常量内存不缓存在 L1 中,而是缓存在常量缓存中。
对这些数据的访问是否会受到存储冲突的影响,例如共享内存(因为 L1 缓存和共享内存实际上是相同的硬件),还是像全局/常量内存那样没有存储冲突?
L1 和常量缓存一次访问一个缓存行,因此没有存储体冲突。