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

时间:2014-05-22 02:40:16

标签: performance cuda parallel-processing

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

但是,如果我只在一个块中运行所有迭代,每个块有一个线程,则运行时间最多为1872秒,这远远超过我只是按比例缩小的240x0.87s = 209s仅使用240个流媒体处理器中的一个。

相反,通过使用所有240个核心,我似乎加速超过2000倍。这种超线性加速怎么可能;在我的系统性能建模中,我应该注意哪些其他因素?

1 个答案:

答案 0 :(得分:5)

启动由1个线程组成的内核将内核执行限制为30个SM中的1个。对于每个发布的warp指令,将仅使用1/32的执行单元。此外,来自相同warp的指令不能在背靠背发布插槽上发出,留下至少1/2的发布槽空。对于指令依赖性和内存延迟,附加插槽将为空,从而加速2-4倍。让我们假设一个非常悲观的2倍。可能的增益的粗略计算将是

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 = 2152x的差异。由于空的发布槽以及每个SM的1个warp无法使内存系统饱和这一事实,很容易将其解释为> 2x。