这是我在GT 440上的内核的Compute Visual Profiler的输出:
请注意标记为粗体的子弹.内核执行时间是121195 us.
我通过将一些局部变量移动到共享内存来减少每个线程的一些寄存器.Compute Visual Profiler输出变为:
因此,现在4块在单个SM上与3先前版本中的块同时执行.但是,执行时间115756 us几乎相同!为什么?是不是完全独立的块在不同的CUDA核心上执行?
tal*_*ies 14
您隐含地假设更高的占用率会自动转化为更高的性能.通常情况并非如此.
NVIDIA架构每个MP需要一定数量的活动warp,以隐藏GPU的指令流水线延迟.在您的Fermi卡上,该要求转化为最低入住率约30%.针对比最小值更高的占用率不一定会导致更高的吞吐量,因为延迟瓶颈可能已经转移到GPU的另一部分.您的入门级GPU没有大量的内存带宽,每MP的3个块很可能足以使代码内存带宽受限,在这种情况下,增加块数不会对性能产生任何影响(它甚至可能由于内存控制器争用和缓存未命中而增加).此外,您说您将变量溢出到共享内存以减少内核的寄存器占用空间.在Fermi上,共享内存只有大约1000 Gb/s的带宽,相比之下,寄存器的带宽大约为8000 Gb/s(请参阅下面的链接,了解显示这一点的微基准测试结果).因此,您已将变量移至较慢的内存,这可能也会对性能产生负面影响,从而抵消高占用率带来的任何好处.
如果您还没有看过,我强烈推荐Vasily Volkov在GTC 2010上的演讲"在较低入住率下表现更佳" (pdf).这里展示了如何利用指令级并行性在非常非常低的占用率下将GPU吞吐量提高到非常高的水平.