【发布时间】:2012-07-01 18:09:18
【问题描述】:
在我的 CUDA 应用程序中,我将数据从设备内存复制到共享内存。该数据是否也缓存在 L1 中?
【问题讨论】:
标签: cuda gpu shared-memory cpu-cache
在我的 CUDA 应用程序中,我将数据从设备内存复制到共享内存。该数据是否也缓存在 L1 中?
【问题讨论】:
标签: cuda gpu shared-memory cpu-cache
默认情况下,来自全局内存的所有内存加载都缓存在 L1 中。全局内存加载的目标位置对 L1 缓存没有影响(无论是寄存器,还是共享内存或线程本地内存)。共享内存本身显然没有缓存。
【讨论】:
这只是为了扩展@talonmies 所说的内容。
复制是低级别的两个独立操作,加载和存储。如果加载和存储访问全局内存,则加载和存储都可以缓存在 L1 和 L2 中。
由于您的副本的加载部分来自全局内存,因此默认情况下它将同时缓存在 L1 和 L2 中。因此,除非编译器检测到从全局内存复制到共享内存的特殊情况并使用非缓存加载,否则您最终会得到两个可以在相同延迟下访问的数据副本,因为共享内存和 L1 缓存是使用相同的物理片上内存。
来自 CUDA C 编程指南 4.2:
每个多处理器都有一个 L1 缓存,所有处理器共享一个 L2 缓存 多处理器,两者都用于缓存对本地或全局的访问 内存,包括临时寄存器溢出。缓存行为(例如是否读取 缓存在 L1 和 L2 中或仅在 L2 中)可以使用加载或存储指令的修饰符在每次访问的基础上进行部分配置。
我找不到任何关于如何从 CUDA C 修改此行为的信息。
【讨论】:
-Xptxas="-dlcm=cg" 将强制汇编器生成 32 字节而不是 128 字节的事务,从而绕过 L1 缓存。