2

我不熟悉 GPU 内存缓存的工作原理,所以想知道与 CPU 相关的内存访问的时间和空间接近度的假设是否也适用于 GPU。也就是说,在 CUDA C 中编程,我是否需要考虑 C 的行优先数组存储格式以防止缓存抖动?

非常感谢。

4

2 回答 2

1

是的,非常。

假设您正在为每个线程获取 4 个字节的整数。

方案一

每个线程都使用其线程 id 的索引获取一个整数。这意味着线程 0 正在获取 a[0],线程 1 正在获取 a[1] 等等......与 GPU 一样,它将在 128 字节的缓存行中获取。巧合的是,warp 是 32 个线程,因此 32*4 = 128 个字节。这意味着对于一个扭曲,它将从内存中执行一个获取请求。

方案二

如果线程以总随机顺序获取索引之间的距离大于 128 字节。它必须发出 32 个 128 字节的内存请求。这意味着您将为每个 warp 填充 32 倍以上的内存的缓存,如果您的问题很大,您的缓存将比方案一多 32 次无效。

这意味着,如果您在场景一中请求通常驻留在缓存中的内存,那么在场景二中,它很可能必须通过来自全局内存的另一个内存请求来解决。

于 2012-12-30T22:48:20.413 回答
0

不,是的。不,因为 GPU 不提供与 CPU 相同类型的“缓存”。

但是您还有许多其他限制,这使得底层 C 数组布局以及并发线程如何访问它对于性能非常重要。

您可以查看此页面以了解有关CUDA 内存类型的基础知识,或查看有关 Fermi GPU 缓存的更多详细信息。

于 2012-12-30T22:52:40.453 回答