我不熟悉GPU内存缓存的工作原理,因此想知道与CPU相关的内存访问的时间和空间接近度的假设是否也适用于GPU。也就是说,在CUDA C中编程,我是否需要考虑C的行主阵列存储格式以防止缓存抖动?
非常感谢。
答案 0 :(得分:1)
是的,非常。
假设您为每个线程获取4个字节的整数。
每个线程都使用其线程ID的索引获取一个整数。这意味着线程零正在获取[0],线程1正在获取[1]等...与GPU一样,它将获取128字节的高速缓存行。作为巧合,warp是32个线程,ergo 32 * 4 = 128个字节。这意味着对于一个warp,它将从内存中执行一次获取请求。
如果线程以总随机顺序获取,则索引之间的距离大于128个字节。它必须产生32个128字节的内存请求。这意味着你将为每个warp填充高速缓存32倍的内存,如果你的问题很大,你的缓存将失效多达32倍于方案一。
这意味着如果您要求在方案一中通常驻留在缓存中的内存,则在方案二中,很可能必须使用来自全局内存的另一个内存请求来解析它。
答案 1 :(得分:0)
不,是的。不,因为GPU不提供与CPU相同的“缓存”。
但是你有许多其他约束使得底层C数组布局以及并发线程如何访问它对于性能非常重要。
您可以查看此页面,了解有关CUDA memory types或here的基础知识,了解有关费米GPU上缓存的详细信息。