【问题标题】:Using texture cache versus coalesced global memory with low cache hit rate?使用纹理缓存与低缓存命中率的合并全局内存?
【发布时间】:2018-01-21 16:55:00
【问题描述】:

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

然后明确的是,对于如此“分散”并且在继续之前只读取 1 次的数据,L1/L2 缓存几乎是无用的。为了弥补内核读取的这种庞大性,我考虑使用纹理内存,它在 L1 中“预缓存”。

这样做可以被认为是“好的”做法吗?

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

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

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

【问题讨论】:

  • 所以您只读取了 1 次数据,并且该读取被合并并且缓存行对齐?
  • 是的。正是这样,并且由探查器检查过
  • 缓存的主要好处是(显式)数据重用,即时间局部性(重用时)。第二个好处是空间局部性,有效地尝试使用缓存作为预取机制。除非您实际上有数据重用,否则我不会期望从中获得巨大的好处。在某些情况下,预取可能会带来一些较小的收益,但是这将高度依赖于代码和访问模式,这是否会提供任何好处。
  • 我现在实际上正在开发基于纹理的实现。在一些变量上,我得到了 1.2% 到 50% 的缓存命中率(实现仍然有点错误,所以也许只是我没有获取相同的数据)。虽然我没有缓存重用,但我的每个经线的模式都非常清晰,我相信这对纹理内存很有好处..?无论如何,当我完成实施时,我可能会在这里回答以记录。

标签: caching optimization cuda gpgpu


【解决方案1】:

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

保留(非特定应用)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多