我不熟悉 GPU 内存缓存的工作原理,所以想知道与 CPU 相关的内存访问的时间和空间接近度的假设是否也适用于 GPU。也就是说,在 CUDA C 中编程,我是否需要考虑 C 的行优先数组存储格式以防止缓存抖动?
非常感谢。
我不熟悉 GPU 内存缓存的工作原理,所以想知道与 CPU 相关的内存访问的时间和空间接近度的假设是否也适用于 GPU。也就是说,在 CUDA C 中编程,我是否需要考虑 C 的行优先数组存储格式以防止缓存抖动?
非常感谢。
是的,非常。
假设您正在为每个线程获取 4 个字节的整数。
每个线程都使用其线程 id 的索引获取一个整数。这意味着线程 0 正在获取 a[0],线程 1 正在获取 a[1] 等等......与 GPU 一样,它将在 128 字节的缓存行中获取。巧合的是,warp 是 32 个线程,因此 32*4 = 128 个字节。这意味着对于一个扭曲,它将从内存中执行一个获取请求。
如果线程以总随机顺序获取索引之间的距离大于 128 字节。它必须发出 32 个 128 字节的内存请求。这意味着您将为每个 warp 填充 32 倍以上的内存的缓存,如果您的问题很大,您的缓存将比方案一多 32 次无效。
这意味着,如果您在场景一中请求通常驻留在缓存中的内存,那么在场景二中,它很可能必须通过来自全局内存的另一个内存请求来解决。