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