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