我理解的线程束(即wrap)是一个block中32个线程的集合,每次这32个线程执行相同的指令不同的数据,但是不是GPU一次只能执行32个线程呢,应该不是吧,我在网上查了一些资料,看见了SIMD和SIMT架构与线程束的关系,感觉更糊涂了,望能给与我指点
LZ您好:
GPU一次可以加载大量/海量线程的,并且有多个warp在同时执行的。
具体为:
1:一个grid可以有非常大量的线程,至少是65535*65535个,具体的限制根据GPU的计算能力版本不同而不同。
2:一个GPU上可以同时resident 大量的线程,根据不同的计算能力版本和SM数量,这个值最大为SM数量*每个SM最大resident线程数量。他们的乘积在千数量级到万数量级的级别。
3:即便是细化到一个时钟周期内,考虑当前正在被硬件执行的线程数量,那么最多也大致在该GPU的CUDA CORE数量级别,这个数量在主流的GPU上,是百数量级到千数量级的。
上述的线程数量除以32即得warp数量,LZ可以参考。
欢迎您午夜莅临论坛,祝您编码顺利~
感谢您的答复!
在1中我有一点有疑问
您说一个grid至少有6553565535个线程
但如果我启动的核函数是kernel<<<65535,512>>>不是只有65535512个线程在grid中吗
而且书上说一个核函数调用中block的最大值是65535,thread的最大值是512
继续上面的提问
是不是kernel<<<65535,512>>>是一维的原因
如果block和thread是二维或三维呢?
以及关于SIMT,您可以通俗地这样理解:
1:他们都跑同样的代码,所以是single instruction。
2:他们都是线程级别的,您可以将每个线程看做一台非常微小的计算机,他们可以有自己的完整代码的程序逻辑。这比SIMD要灵活一些。
3:一个warp的线程经常要达成某种行为上的一致性才有利于发挥硬件效能,但是即便不保证这种一致性,在程序逻辑上也是正确的。
4:您可以在一个block内的线程中,建立起密切的合作关系,如同步和shared memory等。
大致如此,希望能加深您对SIMT的理解。
祝您好运~
LZ您好:
不好意思,前面BUG了,现将2#的1:修正如下:
1.1:一个grid可以有非常大量的线程,至少是6553565535个block,此时的最大线程数是6553565535*512。这是按照1.x计算能力的硬件给出的。以及这里说“至少”是因为更高计算能力版本的GPU能支持更大规模的grid;而此处给出的“最大线程数”是1.x硬件所能支持的极限。
换句话说这是最弱硬件能力下的支持线程数量的上限。
其他硬件版本详情,请参阅CUDA C Programming Guide Appendix.F
1.2 这里说的是“一个grid可以有”很多的线程,而不是“必须有”这么多线程,这是在讨论给定硬件下的支持极限。所以您完全可以少用的。
此外您3#中表述的一个核函数调用的(即一个grid)规模问题,请以官方的programming guide说法为准。
大致如此,时至午夜,精神已经恍惚,周公频频向我招手,前面BUG给您造成困扰敬请谅解。
祝您好运~
深表赞同,ICE加班到周末凌晨,的确辛苦的。请谅解。
(默默在旁边看的人路过。。。)
非常感谢!早点休息!注意身体!