【问题标题】:CUDA bank conflict for L1 cache?L1缓存的CUDA银行冲突?
【发布时间】:2013-02-07 02:27:30
【问题描述】:

在 NVIDIA 的 2.x 架构上,每个 warp 具有 64kb 的内存,默认情况下划分为 48kb 的共享内存和 16kb 的 L1 缓存(服务于 globalconstant 内存)。

我们都知道访问共享内存的存储区冲突——内存被分成 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 和常量高速缓存一次访问一个高速缓存行,因此没有存储库冲突。

    【讨论】:

      猜你喜欢
      • 2015-04-07
      • 2011-03-31
      • 2011-01-18
      • 1970-01-01
      • 2014-03-15
      • 2011-04-20
      • 2012-08-23
      • 1970-01-01
      • 2011-04-20
      相关资源
      最近更新 更多