如何用CUDA代码解释在GPU设备上观察到的超线性加速



我很难理解特斯拉C1060上令人尴尬的并行计算的缩放性能。使用所有块和每个块多个线程来运行它,我得到的运行时间大约是0.87秒。

然而,如果我只在一个块中运行所有迭代,每个块一个线程,运行时间高达1872秒,这比我只使用240个流处理器中的一个所期望的240x0.87s = 209s要长得多。

相反,通过使用所有240个内核,我似乎得到了超过2000倍的速度。这种超线性加速怎么可能?在对该系统进行性能建模时,我还应该注意哪些因素?

启动由1个线程组成的内核将内核的执行限制为30个SMs中的1个。对于每一个发出的warp指令,只有1/32的执行单元被使用。此外,同一经纱的指令不能在背靠背的发行槽上发行,至少有一半的发行槽是空的。额外的插槽将为指令依赖和内存延迟空,使速度提高2-4倍。我们假设一个非常悲观的2x。可能增益的粗略计算为

30x increase for using all 30 SMs
32x increase for using full width of the execution units
 2x increase for using issue slots and saturating memory system
= 30 * 32 * 2
= >1920x performance increase

你看到的是1872/。87 = 2152倍差。这很容易解释为由于空的发行槽和每个SM 1次warp不能使内存系统饱和而导致的>2x。

最新更新