如何分配线程、块?

我将如下的代码改编为kernel函数,
for(int i = 0; i < count; i++)
{
for(int next = i + 1; next < count; next++)
{
if(……)
{
……
}
}
}

如何将这个双层for循环拆成最小的模块,让每个线程都执行一次
if(……)
{
……
}

(1)最简单的拆法就是count * count个线程,然后死掉一半不需要的。

(2)如果count非常非常大的话,建议将外层拆分成多次kernel启动,然后里面则是一次启动count个,count-1个…count - N个, 1个线程。

感谢您的周末来访。

以及,你也可以综合这两种,

当count很大的情况下,先是将外层改成一次次的kernel启动,当判断到内层已经足够小的的时候(例如当循环到最后几百次,将内层改成一次性的启动,处理完剩余的,也行。

当然,这要看看你具体的COUNT的大小,以及内部的那个if(){…}的工作量大小了才能具体决定了。

谢谢您的答复,我还是不太明白 将外层改成一次次的kernel启动??

LZ您好:

就是将内层的一次循环的工作使用一个kernel来完成,这样外层每循环一次,就调用一次kernel。

这适用于内层循环的工作量足够大,可以充分利用GPU资源的情况;或者外层表示某种迭代,后一次循环依赖于前一次循环的结果的情况等。

祝您好运~

谢谢版主的回复;受益匪浅。

我只是将玫瑰斑竹的话稍加解释而已,不敢居功。