在NVIDIA的2.x体系结构上,每个warp都有64kb的内存,默认情况下划分为48kb的共享内存和16kb的L1缓存(为global
和constant
内存提供服务)。
我们都知道访问共享内存的组冲突——内存被划分为32个大小为32位的组,以允许所有32个线程同时独立访问。另一方面,全局内存虽然要慢得多,但不会遇到库冲突,因为内存请求是通过扭曲合并的。
问题:假设全局内存或常量内存中的一些数据缓存在给定扭曲的一级缓存中。对这些数据的访问是否会受到库冲突的影响,比如共享内存(因为一级缓存和共享内存实际上是相同的硬件),还是像全局/恒定内存那样没有库冲突?
在NVIDIA的2.x架构上,每个warp都有64kb的内存默认分区为48kb的共享内存和16kb的L1缓存
计算能力2.x设备每个流式多处理器(SM)有64KB的SRAM,可以配置为
- 16 KB L1和48 KB共享内存,或
- 48KB L1和16KB共享存储器
(为全局内存和常量内存提供服务)。
加载和存储到全局内存、本地内存和曲面内存都要经过L1。对常量内存的访问通过专用的常量缓存。
我们都知道访问共享内存的银行冲突存储器被划分为32个大小为32位的组,以允许同时所有32个线程的独立访问。另一方面,Global内存虽然慢得多,但不会经历银行冲突,因为内存请求通过曲速进行合并。
通过L1对全局或本地存储器的访问是按高速缓存行(128B)进行的。当向L1发出加载请求时,LSU需要执行地址分歧计算,以确定哪些线程正在访问同一高速缓存行。LSU单元然后必须执行L1高速缓存标签查找。如果缓存了该行,则将其写回寄存器文件;否则,该请求被发送到L2。如果warp有未由请求提供服务的线程,则会请求重播,并使用剩余线程重新发出操作。
扭曲中的多个线程可以访问缓存行中的相同字节,而不会引起冲突。
问题:假设缓存了全局内存或常量内存中的一些数据在给定扭曲的L1高速缓存中。
常量内存未缓存在L1中,而是缓存在常量缓存中。
对该数据的访问是否会受到银行冲突的影响,如共享内存(因为一级缓存和共享内存实际上是相同的硬件),还是以全局/常量的方式无银行冲突记忆是?
L1和恒定高速缓存每次访问单个高速缓存行,因此不存在存储体冲突。