CUDA kernel函数执行参数的设置

每个grid中的block数、每个block中的thread数要如何设置可以达到GPU速度计算最大化?

假设是Tesla C2050,14个SM,448个SP,2.0的计算能力,应如何设置可达到计算速度最大化?

还有一个问题,CUDA5.0支持计算能力3.0的卡,我有一块GTX650的卡(计算能力3.0),核数显示
是2*192(是否是指2个SM,每个SM有192个SP),针对这块卡应如何设置?有没有一般性的通用算
法解决kernel函数执行参数的设置问题的?
(上述问题都是在需要的线程数目非常多的情况下,就好比暴力破解MD5)。

手机先简单说下,如何设置和您的算法有关系,一般要尽量利用硬件资源。没有说只根据硬件给出结论的。可以先预设一个分配方案,然后根据profiler结果再更改。

关于650的硬件规模,您的猜测是正确的。

先说这些吧,手机党码字不易,见谅。

调整blockDim 和gridDim主要目的是保证在整个运算过程中,gpu的每个SM中都有足够多的active warps。这里需要注意的是:active warps的数量并不是越多越好,在足够隐藏延迟之后,增加active warp的数量不会带来性能提升。

为了达到这个目标,需要注意三方面:首先,是否有足够大的occupancy,我们可以通过配置toolkit主目录下tool文件夹下的excel计算工具来查看你的配置方案可以实现多大的occupancy。occupancy所代表的是我们现有的配置方案(shared memory,寄存器,blockDim),可以使得一个sm中承载多少个active warps。第二,occupancy并不保证实际运行中是否有这么多的active warps,实际运行中还需要有足够多的block数量,来保证每个sm可以有这么多的active warps。最后,我们还需要注意active warps之间负载均衡的问题,如果一个warp运行时间过长,其他warps都早已结束,这样就会造成虽然occupancy 和block都已经达到了要求,但是实际上没有足够多active warps。在负载严重不平衡的应用中我们尽量增加blockDim 与 gridDim可以让sm在处理长时间warps的同时处理更多warps,增加active warps的数量。

举个例子:
如果我们使用C2050,它有14个sm。我们通过配置shared memory,寄存器,blockDim,达到了100%的occupancy, 也就是说一个sm上可以放置48个warps。假设我们设定的blockDim是256,也就是每个block 8个warps,一个sm上就需要6个block才能达到完全利用上这个occupancy的目标。而因为C2050有14个sm,所以需要gridDim等于6*14。

而如果我们的blockDim为128,也就是一个block有4个warps。为了满足每个sm上48个warps的要求,就需要每个sm上需要12个resident blocks。但是,C2050每个SM最多有8个resident blocks所以永远无法充分利用100%occupancy。

最后,如果我们设置了gridDim = 6*14,blockDim = 256,但是没个block中有一个warp运行时间极长,那么实际上每个sm中active warps只有6个。

谢谢你的回答。对于“active warps之间负载均衡的问题”有点不理解,每个线程执行的指令基本相同,只是针对不同的数据(SIMD),为什么会出现某个wrap运行时间远长于其他wrap的情况?

还有一个问题请教一下:对于计算能力3.0的卡,sm变成了smx,数量明显减少(GTX580有16个sm,GTX680有8个SMX),smx有192个sp,sm有32个sp,但每个smx只可以放置64个warps。假设针对580,我的设置是96256,那对于680,似乎就只有64256,那性能岂不是下降了?

我来简单说下:

1:考虑到程序中可能有分支,这样会造成有些warp执行较长的分支,其他warp执行较短的分支,这样就会出现某些warp运行时间远远长于其他warp。

2:这只是同时resident的warp,当一个resident block算完以后可以换其他的block上,所以虽然同时resident的warp数量有所减少,但如果程序合适,还是可以跑满GPU的。考虑到680的计算规模比580大,一般还是会更快一些的。同时,因为硬件架构上的差异,可能需要进一步调整block划分等,以期获得更好的效果。

欢迎莅临CUDA ZONE,祝您新年快乐!

询问#3 C2050 有14个sm 448个计算单元,应该是每个sm 32个warps吧,不然好像算不出来,所以sm上应该需要4个block…

6#的arven_0您好,fermi架构下,每个SM的最大resident threads数量为1536,所以最大resident warps数量为1536/32=48。

另外,这个是fermi架构决定的,和具体哪款GPU,有多少SM,多少SP其实是无关的。

祝您编码顺利~