这些是我的假设:
- 有两种类型的加载,缓存和非缓存。在第一个中,流量通过 L1 和 L2,而在第二个中,流量仅通过 L2。
- Compute Capability 6.x 和 7.x 中的默认行为是缓存访问。
- 一个 L1 缓存行是 128 字节,一个 L2 缓存行是 32 个字节,因此对于生成的每个 L1 事务,应该有四个 L2 事务(每个扇区一个。)
- 在 Nsight 中,一个 SM->TEX 请求意味着一条由 32 个线程合并而成的 warp 级指令。L2->TEX Returns 和 TEX->SM Returns 是衡量每个内存单元之间传输了多少扇区的量度。
假设计算能力 7.5,这些是我的问题:
- 第三个假设似乎暗示 L2->TEX Returns 对于全局缓存加载应该总是四的倍数,但情况并非总是如此。这里发生了什么?
- 用 const 和 __restrict__ 限定符标记指针还有意义吗?这曾经是向编译器提示数据是只读的,因此可以缓存在 L1/纹理缓存中,但现在所有数据都缓存在那里,只读和非只读。
- 根据我的第四个假设,我认为每当 TEX->SM Returns 大于 L2->TEX Returns 时,差异来自缓存命中。那是因为当缓存命中时,您会从 L1 读取一些扇区,但从 L2 中没有。这是真的?