2013-02-21 74 views
1

在NVIDIA的2.x架构上,每个warp有64kb的内存,默认分区为48kb的共享内存和16kb的L1缓存(服务于globalconstant内存)。一级缓存CUDA银行冲突?

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

问题:假设来自全局或常量内存的某些数据缓存在L1缓存中,用于给定warp。对共享内存(因为L1缓存和共享内存实际上是相同的硬件)是否存在银行冲突的数据访问权限,还是以全局/常量内存的方式没有银行冲突?

回答

7

在NVIDIA的2.x的架构中,每个经纱的存储器有64KB即通过 默认划分成共享存储器的48KB和16KB L1高速缓存的

计算能力2.x设备具有64 KB每流式多处理器(SM)的SRAM,可以作为beconfigured

  • 16 KB L1和48 KB共享存储器,或
  • 48 KB L1和16KB共享存储器。

(服务全局和恒定内存)。

将负载和存储到全局存储器,本地存储器和表面存储器通过L1。对常量内存的访问通过专用常量高速缓存进行。

我们都知道访问共享内存库冲突 - 在 内存被分为32组大小的32位,以允许所有32个线程同时 独立访问。另一方面,尽管内存速度较慢,但​​不会经历存储体冲突,因为 内存请求会在整个warp内合并。

通过L1对全局或本地内存的访问按每个缓存行(128 B)完成。当向L1发出加载请求时,LSU需要执行地址分歧计算以确定哪些线程正在访问相同的高速缓存行。 LSU单元然后必须执行L1高速缓存标记查找。如果该行被高速缓存,那么它被写回寄存器文件;否则,该请求被发送到L2。如果warp具有未被请求服务的线程,则请求重播并且用剩余的线程重新发布该操作。

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

问题:假设来自全局或常量内存的某些数据在给定warp的L1缓存中被缓存为 。

常量内存不在L1中进行高速缓存,而是缓存在常量高速缓存中。

是访问该数据受到银行的冲突,如共享内存 (因为L1缓存和hared记忆其实都是同一 硬件),或者是银行无冲突的方式全球/常量 内存是?

L1和恒定缓存一次访问单个缓存行,所以没有银行冲突。