在我的CUDA应用程序中,我将数据从设备内存复制到共享内存。该数据是否也在L1中缓存?
答案 0 :(得分:3)
默认情况下,全局内存中的所有内存加载都缓存在L1中。全局内存加载的目标位置对L1高速缓存没有影响(无论是寄存器,还是共享内存或线程本地内存)。共享内存本身显然没有缓存。
答案 1 :(得分:1)
这只是为了扩展@talonmies所说的内容。
副本是低级别的两个独立操作,负载和存储。如果加载和存储访问全局内存,则它们可以缓存在L1和L2中。
由于副本的加载部分来自全局内存,因此默认情况下它将在L1和L2中缓存。因此,除非编译器检测到从全局内存复制到共享内存并使用未缓存的加载的特殊情况,否则最终会得到两个数据副本,这些副本可以在相同的延迟时间内访问,因为共享内存和L1缓存是使用相同的物理片上存储器。
来自CUDA C编程指南4.2:
每个多处理器都有一个L1缓存,所有人都共享一个L2缓存 多处理器,两者都用于缓存对本地或全局的访问 内存,包括临时寄存器溢出。缓存行为(例如,是否读取 可以在每个访问的基础上使用修饰符对加载或存储指令进行部分配置,只能在L1和L2以及L2中缓存。
我找不到任何关于如何从CUDA C修改此行为的信息。