如果线程数超过了一个格包含的线程数怎么办

我只知道<<<a,b>>>里面设置的是a个线程块,每个线程块有b个线程,但是如果我需要的线程数超过了一个格所能包含的最大线程数怎么办

LZ您好:

随着计算能力版本的提升,grid中最大线程的数量是随之增加的,并且是一个极为巨大的数字。

以及,如果您真的发现线程数量已经不够用了,那么:

方法一:拆分为两个grid,通过调用两次kernel来实现。以此类推,还可以拆分为多个grid。

方法二:改写算法,使得每个线程干更多的活,从而用较少的线程解决较大规模的问题。

大致如此,供您参考。

祝您好运~

谢谢。我想拆分成多个grid,但是不知道怎么对不同grid进行操作,我目前能解决的就是对同一个grid下的线程进行操作

LZ您好:

这个问题其实很简单,只是您没有想明白而已。

目前启动一次kernel仅对应一个grid,那么您多次启动kernel处理不同的数据即可。这就是所谓的“拆成多个grid”。

所以无论拆成多少个grid,都和一个grid用法一样。

祝您编码顺利~

吼吼,知道了,只是这么看起来要分的就更加麻烦点了

版主你是不是夜猫子,还是因为上班的原因只能晚上来论坛

果断不是。ICE白天也在的,如果你不喜欢ICE晚上回复你。我可以代为转告他,让他晚上无视你,这样可以避免晚上对你造成干扰,如何?

千万不要,横扫版主不要计较这点鸡毛蒜皮的小事了:P

但是如果是多次调用核函数的话,那不就变成类似串行的了吗?而且一次只能用一个grid的线程,那max grid dimensions:<63353 63353 63353>不就是没用了吗?

“一次只能用一个grid的线程,那max grid dimensions:<63353 63353 63353>不就是没用了吗?”

----无法理解楼主您的中文,您能否有简单点的汉语慢慢阐述下您的观点究竟是啥意思?

LZ您好:

1:多次调用kernel,那么每个kernel对应的grid确实是一个接着一个执行的。但这又有什么关系呢?你一个grid执行的时候也不是说一个周期全部结果都出来的,线程们也是一批一批执行的。以及这个和效率也没有直接关系。

2:“而且一次只能用一个grid的线程,那max grid dimensions:<63353 63353 63353>不就是没用了吗?”——我和横扫斑竹同样无法理解您的逻辑。
以及,这里面是65535而不是63353;
以及这个数量是和计算能力版本相关的,您使用3.x版本计算能力的显卡可以实现((2^31)-1)6553565535大小的grid;
以及这个dimension是按照block数量计算的,实际换算到线程数量还需要乘以每个block内部线程数量的;
以及这个限制不是同时可用的grid数量。

3:我不是夜猫子的,我白天一般也在,但不保证每天每时每刻都在,也不保证周末都在,也不保证每个帖子都能立即回答,也不保证每晚都在。我回帖的时刻是我在的时刻,但反之不成立。

大致如此,供您参考。

祝您好运~

版主好,版主很辛苦也很细心很负责[indent]1.我的想法是如果能够一次性调用多个(N个)grid来满足我要的线程数(如果我有足够多的线程),那么不管我完成一次调用需要多少个周期,如果能grid能并行起来的话,效率总归是一个核函数一个核函数调用的N倍左右;[/indent][indent]2.这个肯定是我理解有问题。版主你看我这么说对不对,如果是下面这样[/indent][indent]max threads per block:1024[/indent][indent]max thread dimensions<1024 1024 64>[/indent][indent]max grid dimensions<65535 65535 65535>[/indent][indent]那我每个grid的最大线程数就是65535102465535102465535*64,这个是我每次调用核函数能调用的线程最大的数目[/indent]

LZ您好:

1:多次调用kernel,kernel执行之间确实是串行的(一般情况),但是每个kernel执行的时候,将有一整个grid的线程为您服务,此时这些线程是并行的,并且一般能比较充分地利用您的GPU资源。所以是无妨的。

2:请您对max grid dimensions的理解请依据CUDA C Programming Guide的说法,以及我前面的解释是与该手册一致的。以及我们无法理解您的表述的。

祝您好运~

在核函数外面加循环

LZ您好:

今天发现您12#的内容被重新编辑过,这使得13#原本针对的内容不复存在。

请您以后对于新的看法和补充重新开楼表述,以免造成看帖之人的困惑,以及以此表示对原回帖的尊重。

对于您12#我现在看到的内容,我重新答复如下:

1:您的看法是错误的,一次kernel执行本身只有一个grid,在grid很小的时候,可以通过多stream的方式同时并行多个kernel/grid,并行的数量并不多,如16个。
以及,您对您所谓的“多个grid并行”的看法和对效率的估计完全是错误的。
在grid中线程数较多的时候,是无法实现grid并行的,所以此种情况下,您的前提无法成立。
在grid中线程数量较少并使用多stream的时候,可以实现较少数量的grid并行,但是无法达到您所设想的效率提升。

换句话说,您的看法的逆否命题大致为“只使用一个grid,则无法高效率地使用GPU”,这明显是不成立的。

2:您的看法依然是错误的。

您应该用您的GPU所支持的一个grid中最多能容纳的block数量*每个block所能容纳的最多threads数量得到您grid中最多可容纳的线程数量。

您这里给出了“max threads per block:1024”,但是随后“那我每个grid的最大线程数就是65535102465535102465535*64”又违背了这一点。

也即,block三个维度方向上尺寸的最大值并不能同时达到。

大致如此。

这个是我考虑不周到,以后如果有修改的话我会重新开帖的。
还是要谢谢ice版主,这下对这个清楚很多了。

嗯,我会考虑的,谢谢