关于任务分配的疑问

我用的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 就是在读各种例子,脑子里又想着自己的程序,晕乎了,哈哈