Block大小怎么选择

有4040700*sizeof(float)的数据量,进行处理时可以:

1):取td<<32,32>>,那么需要(4040700)/(32*32)=1093.75=1094block,这里可以取<<33,34>>,也可以取bk<<33,1>>循环34次;

2):取td<<16,32>>,那么需要2188个block,这里取bk<<47,47>>,也可以取bk<<47,1>>循环47次;

那么1)、2)的那种情况比较好?

3):我的GPU是GTX 650 Ti,一个有4个MP192 CUDA core/MP=768 CUDA core,我的理解4个MP就是4个SM,比较有用。因此,每个GPU可以resident的block最多为:4SM8Block/SM=32block。要使SM的使用率最高,就必须让SM上的warp尽量

多,因此thread取1024是最好的(不考虑share/register的限制),这样可以有32*4=128个warp可以用于切换。但是这样的话每个block就不容易完成,后面的block就不容易补充上去。如果我thread取32,那么一个block上面就有8个warp可以用于切换,但是这样block容易完成,后续的可以容易补充上去,即可以始终保持8个warp的切换量,那么在不考share/register限制的情况下,到底是那种比较好呢?

谢谢斑竹,同时祝周末愉快!

楼主您好,

您的数据有误,贵卡是计算能力3.0, 最多一个SM可以驻留16个blocks和64个warps.
您的是4个SM最多可以同时驻留64个blocks/256个warps。
请使用新数据重新思考您的问题。

以及,关于各种形状,请以实际的运行效果为准。并无理论上的唯一定论。

感谢周末来访。

代为修正一处笔误

我来稍微补充一下2#横扫斑竹:

1:LZ需要明白,每个线程处理一点是一种常用的做法,但并非是唯一的做法。如果考虑优化程序,不应被这个观念所束缚。

2:给定计算规模的时候,您可以选择维持每个线程较大的工作量和较小的线程数目规模(grid 规模);也可以选择维持每个线程较小的工作量和较大的线程数目规模(grid 规模),甚至可以维持每个线程较小的工作量和较小的线程数量规模(grid规模)并反复启动kernel。
原则上这些方法都是可以的,但是效率会有不同,需要实际情况确定。

3:您的GTX 650 Ti的GPU上每个SM/SMX/MP上同时resident block的数目最多是16个,但是这并非是唯一的约束。每个SM上能resident的block数量还受到block规模的影响以及其他资源使用量的影响。
如果您使用很小的block并且无其他限制,那么每个SM上排满16个block之后可能还无法达到最大resident thread的数量,这样有可能影响效率(注意,是有可能而不是一定)。
如果您的block含有1024个thread,在没有其他限制的情况下,每个SM上最多只能resident 2个block就达到了最大resident threads的限制。(所以您之前的计算方法:“给SM上按照最大resident block数量塞满最大容量的block”是不正确的)
较大的block在每个block计算结束的时候,可能会影响一点效率。

以及block的大小其实也是按照具体算法的复杂程度等因素设定的,一般习惯使用256,192这样的典型值,但这并非教条。

如横扫斑竹所说,如何选取block规模并无唯一定论,需要根据实际情况确定,您可以根据实际运行的结果加以调整和尝试。

祝您好运~

我一般取16的倍数做block中的thread数目

建议选取32的倍数。

谢谢斑竹的解答。。

不客气的,欢迎您常来论坛讨论~

lz您好:
请问哪里可以查到各种型号显卡的计算能力,以及支持的sm驻留block个数的参数?

cuda编程指南附录A里面指出的网址(没权限贴url)
列出了nvida各种卡的计算能力

“sm驻留block个数”, 要看卡的结构。
以kepler110为例
一个sm最多有2048个线程, 64组warps, 16个blocks
然后有65536个寄存器
根据你block的线程数,及每个线程使用寄存器的情况,及共享内存的情况,
所有的限制取一个下限,
就是一个sm常驻的block数

您好:

您可以在CUDA C Programming Guide中找到,在5.0版本中为Appendix.F,在 5.5版本中为Appendix.G。

祝您好运~

是的,可以人为计算的,以及如果想省事的话,可以跑一下 visual profiler,会自动统计出结果的。

感谢您积极回帖,参与论坛讨论。

祝您好运~