使用纹理缓存与低缓存命中率的合并全局内存?

Using texture cache versus coalesced global memory with low cache hit rate?

在优化和分析内核的过程中,我注意到它的 L2 和全局缓存命中率非常低(~1.2% 平均)。我的内核通常每次 warp 每次通过读取 4 个完整的缓存行,每个 SM 有 3 个块(所以 4 * 32 * 2 = 256 行缓存每个 SM 我的内核每次通过,具有可变的通过号)。读取来自全局内存的不同区域,这显然很难缓存。 (区域的格局是A, 32 * B, A .....)

然后就清楚了,对于如此"dispersed"且在继续之前只读了1次的数据,L1/L2缓存几乎没用。为了弥补我内核读取的这种庞大,我考虑使用纹理内存,在 L1 中是 "pre-cached"。

可以考虑"good"这样练习吗?

附带问题 1:如果访问该纹理 合并(假设行主要)它是否仍然比非合并纹理读取有性能提升?

附带问题 2:由于我的数据是以一种方式读取的,因此每个扭曲读取 1 行,2D 纹理真的那么有用吗?还是 1D 分层纹理更适合这项工作?

很抱歉,如果附带问题已经在其他地方得到了回答,我正在写这些问题,但快速研究(可能使用了错误的词汇)没有得到答案。抱歉,如果我的问题很愚蠢,我关于 CUDA 的文献仅限于 nVidia 文档。

最后,基于纹理的实现并没有带来多少。据我了解,当缓存率上升(~50%)时,缓存层次结构或纹理单元肯定会有开销。

保留(非特定应用)

纹理内存有轻微的开销,这使得只有在给定的过滤有好处并且整个纹理可以放入缓存的情况下才值得,允许 2D 完美缓存内存抵抗非-合并访问。