首页 文章

L1缓存的CUDA银行冲突?

提问于
浏览
1

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

我们都知道访问共享内存的银行冲突 - 内存分为32个大小为32位的存储区,允许所有32个线程同时独立访问 . 另一方面,全局内存虽然慢得多,但不会遇到银行冲突,因为内存请求在整个warp中合并 .

Question: 假设来自全局或常量内存的某些数据缓存在L1缓存中以获得给定的warp . 访问此数据是否存在银行冲突,例如共享内存(因为L1缓存和共享内存实际上是相同的硬件),还是以全局/常量内存的方式无冲突?

1 回答

  • 8

    在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中合并 .

    每个高速缓存行(128 B)完成通过L1到全局或本地存储器的访问 . 当向L1发出加载请求时,LSU需要执行地址差异计算以确定哪些线程正在访问相同的缓存行 . 然后,LSU单元必须执行L1高速缓存标签查找 . 如果该行被缓存,则将其写回寄存器文件;否则,请求被发送到L2 . 如果warp的请求没有服务的线程,则请求重放,并重新发出剩余线程的操作 .

    warp中的多个线程可以访问缓存行中的相同字节而不会导致冲突 .

    问题:假设来自全局或常量内存的一些数据缓存在L1缓存中以获得给定的扭曲 .

    常量内存不会缓存在L1中,而是缓存在常量缓存中 .

    访问此数据是否存在银行冲突,例如共享内存(因为L1缓存和hared内存实际上是相同的硬件),还是以全局/常量内存的方式无冲突?

    L1和常量高速缓存一次访问一个高速缓存行,因此没有库冲突 .

相关问题