好吧,我的问题可能是一般性的,因为我现在没有具体的问题。
然而,根据我过去的经验,我从未见过CUDA的只读数据缓存优于其他类型的内存访问,例如全局内存或常量内存,在最好的情况下,只读数据缓存将与直接非合并全局一样快内存访问,这让我觉得我可能做错了什么。
所以我的问题是在什么情况下只读数据缓存会比其他类型的内存访问更快?
默认情况下,GK110 设备禁用普通全局访问的L1 缓存。这意味着全局读取可能会缓存在 L2 中,但不会缓存在 L1 中。L2 缓存的访问延迟比 L1 更长。
如果您的数据是只读的,并且编译器能够发现它,或者您使用 协助编译器对全局指针内核参数进行适当的修饰const ... __restrict__ ...,则可以使用只读缓存。如果使用它,则访问延迟将更接近于在只读缓存中命中的项目的 L1 类型延迟,而不是仅在 L2 缓存中命中的项目的 L2 类型延迟。
缓存通常仅在存在数据重用的情况下对代码性能产生影响。如果您的设备代码仅从特定全局变量读取一次,则不太可能有任何缓存优势。
如果您想查看具体的代码示例,请查看我在这里提供的答案。当我从内核参数中删除const __restrict__限定符时,我发现 K40c 上存在性能差异(并且我在答案中记录了该差异)。
| 归档时间: |
|
| 查看次数: |
2288 次 |
| 最近记录: |