我用的G100的卡 这个卡的SM只有一个…
这样的话 我觉得分配一个block 才是最好的…
但是我看了点CUDA的资料 上面的例子似乎都一个SM分配2个
然后我试验了下 把用一个BLOCK完成的 代码 写成了用两个BLOCK完成(基于G100)
但是 时间增加了…
所以 我认为 一个SM分配一个BLOCK是最好的,这和CPU上多线程编程类似。
但是,我还是很疑问 所以我想请教下 我这么想对嘛?
我用的G100的卡 这个卡的SM只有一个…
这样的话 我觉得分配一个block 才是最好的…
但是我看了点CUDA的资料 上面的例子似乎都一个SM分配2个
然后我试验了下 把用一个BLOCK完成的 代码 写成了用两个BLOCK完成(基于G100)
但是 时间增加了…
所以 我认为 一个SM分配一个BLOCK是最好的,这和CPU上多线程编程类似。
但是,我还是很疑问 所以我想请教下 我这么想对嘛?
1:因为cuda要满足一定的通用性,可以在不同的SM数量的GPU上执行,并都取得较好的效果,如果您按照1个SM的GPU写好,只使用了1个block,那么在10SM的GPU上,岂不是有9个SM都无法工作?所以,一般block数量并不是根据GPU上SM的多少确定的。
2:block的数量如何确定?这取决于您的问题规模,算法实现和block规模。在算法实现允许的情况下,总的规模除以block的规模即是block的个数。总的规模是需要解决的问题决定的,一般无法修改。block的规模则是根据kernel的资源占用情况划分,通过权衡各项资源的占用情况,使得SM上加载的线程数量最大化,提高occupancy。一般而言一个block上256~512线程这样都是典型的情况。
3:我认为,在同样kernel,同样总的线程数,一个SM的情况下,划分为1个block和2个blocks,并不会有什么速度上的变化。
大致如上,请LZ参考。
欢迎莅临CUDAZONE,祝您编码愉快~
嗯 好的 谢了:)
不客气
:3_48::3_48::3_48:
当block的数目确定下来之后,比如说是256,,那么用dim3定义blocks时,一维的256和二维的16*16之间有区别么?
直接说,没区别,都是256个线程。
但特定的安排可能会减少你的运算步骤。方便计算。
例如你一个(256,1,1)的和(16, 16,1)的,可以如下对应(假设你需要线性的线程编号):
n号线程是: threadIdx.x (对于前者)
n号线程是: threadIdx.y * 16 + threadIdx.x
你看,前者对于这个例子,就用起来简单些。后者则麻烦点,需要换算一下(虽然的确是1:1映射关系)。
简单地说,只对程序员安排算法有影响,你可以选择方便的来,对硬件无影响。
简单地说,只对程序员安排算法有影响,你可以选择方便的来,对硬件无影响。
非常感谢!
我就是在疑惑,既然二者是等价的,那么Nvidia为什么要这样子来设计呢?
嘿嘿,也看到BZ您在我另一个帖子的回复了,非常感谢!
ICE已经在多个帖子帮你回答多次了!!
我再说一次:“为了你的算法方便!!”
"啊~为了你啊为了你啊~生命有意义~啊!为了你啊为了啊!一切不容易!”
:L 我目前太菜,还没体会到,莫怪莫怪,嘿嘿
能否麻烦BZ再去我发的那个帖子里看一下呢? 我还有一个别的疑惑求解答,十分感谢啊!!!!:2_37:
淡定淡定,您的EXP持续增长中!
嗯嗯。没体会到不妨看下6#的例子,多看自己,自然明白,直接用和又乘又加的来换算(针对那个例子),是节省功夫的。
当然,如果您认为直接折腾一下没事。。那。。。那就没事吧。
:lol:lol:lol 就是在读各种例子,脑子里又想着自己的程序,晕乎了,哈哈