用户
 找回密码
 立即注册
xfortius 该用户已被删除
发表于 2013-9-15 09:29:36
2104610
本帖最后由 xfortius 于 2013-9-15 09:54 编辑

有40*40*700*sizeof(float)的数据量,进行处理时可以:
1):取td<<32,32>>,那么需要(40*40*700)/(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个MP*192 CUDA core/MP=768 CUDA core,我的理解4个MP就是4个SM,比较有用。因此,每个GPU可以resident的block最多为:4SM*8Block/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限制的情况下,到底是那种比较好呢?
谢谢斑竹,同时祝周末愉快!


使用道具 举报 回复
发表于 2013-9-15 11:42:54
本帖最后由 ice 于 2013-9-15 12:15 编辑

楼主您好,

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

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

感谢周末来访。
------------------------------------------------------------------------
代为修正一处笔误
使用道具 举报 回复 支持 反对
发表于 2013-9-15 12:14:44
我来稍微补充一下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规模并无唯一定论,需要根据实际情况确定,您可以根据实际运行的结果加以调整和尝试。

祝您好运~
使用道具 举报 回复 支持 反对
发表于 2013-9-15 15:48:11
我一般取16的倍数做block中的thread数目
使用道具 举报 回复 支持 反对
发表于 2013-9-15 15:52:45
tengwl 发表于 2013-9-15 15:48
我一般取16的倍数做block中的thread数目

建议选取32的倍数。
使用道具 举报 回复 支持 反对
发表于 2013-9-15 17:25:34
横扫千军 发表于 2013-9-15 11:42
楼主您好,

您的数据有误,贵卡是计算能力3.0, 最多一个SM可以驻留16个blocks和64个warps.

谢谢斑竹的解答。。
使用道具 举报 回复 支持 反对
发表于 2013-9-15 17:40:06
xfortius 发表于 2013-9-15 17:25
谢谢斑竹的解答。。

不客气的,欢迎您常来论坛讨论~
使用道具 举报 回复 支持 反对
发表于 2013-9-21 17:00:34
lz您好:
       请问哪里可以查到各种型号显卡的计算能力,以及支持的sm驻留block个数的参数?
使用道具 举报 回复 支持 反对
发表于 2013-9-21 18:04:23
cuda编程指南附录A里面指出的网址(没权限贴url)
列出了nvida各种卡的计算能力

"sm驻留block个数", 要看卡的结构。
以kepler110为例
一个sm最多有2048个线程, 64组warps, 16个blocks
然后有65536个寄存器
根据你block的线程数,及每个线程使用寄存器的情况,及共享内存的情况,
所有的限制取一个下限,
就是一个sm常驻的block数
使用道具 举报 回复 支持 反对
发表于 2013-9-21 22:53:00
南源 发表于 2013-9-21 17:00
lz您好:
       请问哪里可以查到各种型号显卡的计算能力,以及支持的sm驻留block个数的参数? ...

您好:

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

祝您好运~
使用道具 举报 回复 支持 反对
12下一页
发新帖
您需要登录后才可以回帖 登录 | 立即注册