请教CUDA运算时给kernel分配的block及thread维度

RT,以block维度为例, 比如dim3 block1(256,1)
dim3 block2(16,16)
在实际分配给kernel进行运算的时候,二者之间有什么区别么?

个人认为同时进行计算的active block数目就应该是MP的个数,比如在C2050中为14。那么不管block的维度如何设置,只要个数N相同,那么计算起来不论存储区管理或者线程调度就应该是一样的。不知道这样理解对不对呢?

非常感谢!

1:您说的两种分配方法,对使用者来说,线程的索引排法不一样,写程序的时候要根据自己的需要选择。对机器来说,他们都将被换算为一维增加的线程序列,然后按warp处理,从这一点上来说,机器其实无所谓你用哪个形式。

2:“active block”按照官方手册的说法,称之为“resident block”,其数量一般要大于SM的个数。以及如前所说,无论block维度如何设置,只要合理,其实对于机器是没有关系的。

3:“不论存储区管理或者线程调度就应该是一样的”可否具体解释一下?这里面存储区域一般是分配好的,而线程调度是自动的,无法控制。

大致如上,供LZ参考。

祝LZ新年快乐,编码愉快~

非常感谢! 关于第3条,我的疑惑是: 从硬件上来说,一个MP上同一时刻只能运行一个block,但是不用非要彻底运行完一个block才能切换到其他的block(但愿我理解的对)。但问题是,由于shared memory的lifetime是跟随block的,那么在MP切换block的时候,shared memory外加block中所有的register也都要跟着更新,这样子岂不是太浪费资源了? 难道是因为shared memory和register的更新速度快得以至于操作时间可以忽略么?

其实是这样的:一个MP(SM/SMX)上可以同时resident 多个blocks,MP可以从这些resident blocks上面以warp为单位拿就绪的线程来计算。

如果一个MP上resident了2个block,那么无论是寄存器资源还是shared memory资源,每个block所占用的数目都不能超过MP所拥有资源的一半。也就是说,是多个resident blocks共享一个MP上的资源。

所以不存在更新的问题,但是需要程序员估算当前计算会受到哪个资源数量的限制,以调整优化。

大致如上,供您参考。

祝您编码愉快~

超哥!不是这样的。

一个MP上同时总是有多个blocks的。他们每个block的shared memory占用,寄存器占用数,这些加起来,要小于总的SM上的这些资源的最大值。

因为他们同时存在,所以无需您理解的那样“一个block释放掉shared memory,释放掉寄存器了,下一个block才能上来”。

因为您的前置条件“MP切换block的时候,shared memory外加block中所有的register也都要跟着更新”不成立,所以您的结论“shared memory和register的更新速度快得以至于操作时间可以忽略么”自然也不成立。

:slight_smile:

透彻! 感谢!

鄙人惭愧啊,辛苦BZ大人了! 十分感谢!

没事的。每个人都是从新人走来的,退回10年前,还没有人比chaoge你理解cuda更多呢

所以无需惭愧。你终有一天会超越我们的。:slight_smile:

励志啊,励志!!:3_59::3_59::3_59: