在NVIDIA的2.x架构中,每个warp都有64kb的内存,默认分为48kb的共享内存和16kb的L1缓存(服务global
和constant
内存)
我们都知道访问共享内存的银行冲突 - 内存分为32个大小为32位的存储区,允许所有32个线程同时独立访问。另一方面,全局内存虽然慢得多,却不会遇到银行冲突,因为内存请求会在整个warp中合并。
问题:假设来自全局或常量内存的一些数据缓存在L1缓存中,用于给定的warp。访问此数据是否存在银行冲突,例如共享内存(因为L1缓存和共享内存实际上是相同的硬件),还是以全局/常量内存的方式存在冲突?
答案 0 :(得分:8)
在NVIDIA的2.x架构上,每个warp都有64kb的内存 默认分区为48kb的共享内存和16kb的L1缓存
计算能力2.x设备每个流式多处理器(SM)具有64 KB的SRAM,可配置为
(服务于全局和常量内存)。
加载并存储到全局内存,本地内存和表面内存通过L1。访问常量内存需要通过专用的常量缓存。
我们都知道访问共享内存的银行冲突 - 存储器分为32个大小为32位的存储区以允许同时存储 所有32个线程独立访问。另一方面,全球 内存虽然慢得多,却不会出现银行冲突,因为 内存请求在整个warp中合并。
每个缓存行(128 B)通过L1访问全局或本地内存。当向L1发出加载请求时,LSU需要执行地址差异计算以确定哪些线程正在访问相同的缓存行。然后,LSU单元必须执行L1高速缓存标签查找。如果该行被缓存,则将其写回寄存器文件;否则,请求被发送到L2。如果warp的请求没有服务的线程,则请求重放,并重新发出剩余的线程。
warp中的多个线程可以访问缓存行中的相同字节而不会导致冲突。
问题:假设缓存了来自全局或常量内存的一些数据 在给定warp的L1缓存中。
常量内存不会缓存在L1中,而是缓存在常量缓存中。
访问此数据是否存在银行冲突,例如共享内存 (因为L1 Cache和hared Memory实际上是相同的 硬件),还是以全局/常量的方式无冲突 记忆是什么?
L1和常量缓存一次访问一个缓存行,因此没有库冲突。