2012-06-30 56 views

回答

2

默认情况下,全局内存中的所有内存负载均缓存在L1中。全局内存加载的目标位置对L1缓存(无论是寄存器还是共享内存还是线程本地内存)都没有影响。共享内存本身显然不被缓存。

1

这只是为了扩展@talonmies说的。

副本是两个独立的操作在低级别,负载和商店。如果加载和存储访问全局内存,则它们可以缓存在L1和L2中。

由于副本的加载部分来自全局内存,因此默认情况下它将被缓存在L1和L2中。因此,除非编译器检测到从全局共享内存复制到共享内存并使用未缓存的加载的特殊情况,否则最终会得到两个数据副本,这些副本可以以相同的延迟访问,因为共享内存和L1缓存是通过相同的物理片上存储器。

从CUDA C编程指南4.2:

存在L1高速缓存为每个多处理器和通过所有 多处理器,共享的L2高速缓存两者都用于缓存访问本地或全局 存储器,包括临时登记泄漏。高速缓存行为(例如,是否读取 缓存在L1和L2中或仅L2中)可以使用对加载或存储指令的修饰符在每次访问的基础上部分配置。

我找不到任何关于如何这种行为可以从CUDA C.修改任何

+3

它不能在用户代码进行修改,但对于费米和开普勒的设备,它可以通过编译器选项来修改。使用'-Xptxas =“ - dlcm = cg”'将强制汇编程序生成32字节而不是绕过L1缓存的128字节事务。 – talonmies