CUDA5 Profiler中造成global_cache_replay_overhead的原因是什么?

手册上对globa_cache_replay_overhead的解释是globalmemory cache misses造成的instructionreplay,local_replay_overhead类似,是localmemory cache misses造成的instructionreplay。问题是,如果cachemisses,直接到显存中取就行了,为什么会造成instructionreplay?有必要重新发射指令吗?

我想这是因为cache的地址与global地址是不同的,如果未命中,则必须重新发射访存指令,去global中取数据!

一般来说cache是透明的,这意味着,无论该数据在cache里面还是在global memory里面,其逻辑上对应的地址是相同的。当然,cache自身可能有自己的内部地址组织方法,以及这里面维护有一个映射的关系。

LZ的这个问题有些接近具体的硬件行为了,我并不清楚这一点,因此,有待于其他人继续补充了。

我觉得不对,cuda的cache我不是太清楚,但是就cache这个东西来说,是没有地址一说的吧。cache中的内容就是memory的一个子集,并没有为其编址。cpu用地址在cache中找数据时,像3# ice说的那样,是用一种映射关系找的,把地址映射到cache的一个或多个位置,而不是像在memroy中用地址直接访问。

但你说的结果也是一种可能,没准就是如果cache不命中的话,必须要重新发射一条指令在memory中找。但是觉得cpu不会这样做,应该是等着从memory中找到后返回,不会因此重新发射一次指令。

GPU一般在cache miss的时候不会等,实际上即使是cache命中,或者是读取寄存器,都需要不少周期,寄存器似乎是十几二十个周期,此时一般是把warp先切换出去,换一个访存就绪的warp进来执行,除非所有warp都在等待访存。

不过顶楼的instruction replay是为何,我还是不甚清楚。

根据某来源的民间估计,可能是这样的,当LSU读取cache miss的时候,硬件会自动从global memory里面向cache载入所需数据,但LSU自身可能设计的较为简单,并不能保存之前的读取指令或者通知scheduler数据就绪,而是需要scheduler重新发射指令去询问或者读取,如此会产生instruction replay。

当然上述说法并非NV官方说法,NV也未公开过其具体实现,因此仅供参考/讨论/揭批。

祝您编码愉快~