有几个Fermi架构GPU关于cache和GMEM的问题想请教一下

版主您好,小弟有几个Fermi架构GPU关于cache和GMEM的问题不是很清楚,想请教一下:
(1) 在默认情况下,Fermi架构GPU的访存顺序是L1 cache->L2 cache->GMEM。假设在某一warp在第一次访存的时候(假设warp刚好需要128Byte的数据,且是对齐的),L1不命中,L2不命中,会去GMEM中读取128Byte的数据,这128Byte的数据是只会缓存到L1中?还是既会缓存到L1中也会缓存到L2中?如果既缓存到L1也缓存到L2,那么L1和L2中缓存的数据始终是相同的,也就不存在L1 miss,L2 命中的情况啊。那访存顺序直接是L1 cache->GMEM不就行了吗?
(2) 如果使用了shared memory,每次去GMEM读取的数据量是多大啊?是128Byte么(因为shared memory和L1 cache一样都是片上缓存)?还是其他的,比如32Byte之类的?
(3) L1,L2的数据读取速度区别大么?我在默认打开L1 caching的情况下测试,和关闭L1 caching的情况下测试了一下程序,发现耗时差不多的。

楼主您好,

(1)如果是初次填充,将同时位于某个SM上的L1 cache和L2 cache中。(请注意,不是所有的L1)。
(2)其他的SM上的L1依然可以miss, 然后hit在L2上的。
(3)以及,及时是在这个SM上,依然存在L1中的该128B line被驱逐掉(例如,L1满了,被干掉), 而L2依然可以hit的。

(4)shared memory的填充,和您对global memory的读取并无直接关系,N卡的shared memory不能直接和global memory交互的。数据均来自寄存器,而寄存器中的数据,需要从多少global memory
中的数据变换来,这个不一定的。(甚至可以无需读取global memory, 例如一段对shared memory清零的代码)

(5)在fermi上,L1和L2存在不同的吞吐率和不同的延迟,以及不同的传输粒度。区别还是很大的。

感谢您的周末来访。皮特。

时间差不多有可能是因为瓶颈不在数据传输上。或者程序的L1 cache命中率太低。前者针对其他方面进行优化,后者修改数据结构。L1 cache L2 cache速度是有数量级差别的。