关于kernel函数中的分支

小弟菜鸟,最近在做有关图像处理方面的内容。遇到一个问题,是关于颜色空间转化的。在转化过程中,必须要用到判断语句,而且是三个不同条件。但是kernel最讨厌的就是分支换乱,不知都各路大神能不能帮帮小弟。

楼主您好:

这个是要看情况的,当您已经确定前提算法无可更改的情况下,那么就大胆的用吧。因为此时:
(1)你已经无法有别的选择了,要么用CUDA, 要么不用。
(2)则是不一定会真的造成分支的,例如您的数据安排正好能使分支在warp边界,此时无影响。
此外就是还有另外一种情况:如果编译器能成功合并安排分支的大部分指令,也基本无影响。

您可以参考我给出的这个例子:

bool cond = …;
if (cond)
{
a++;
b++;
c++;

z++;
}
else
{
a–;
b–;
c–;

z–;
}

实际上编译器可以考虑安排成:
bool cond = …;
if (cond)
{
tmp = 1;
a += tmp;
b += tmp;
c += tmp;

z += tmp;
}
else
{
tmp = -1;
a += tmp;
b += tmp;
c += tmp;
…;
z += tmp;
}

从而进一步的,编译器发现两个分支体的绝大部分语句是可以合并的,于是变成:
bool cond = …;
if (cond)
{
tmp = 1;
}
else
{
tmp = -1;
}
a += tmp;
b += tmp;
c += tmp;

z += tmp;

从而使得此处的分支基本无害了。不会造成200%的性能下降。

类似的例子还有很多。这个是给您示范的。

以及,如果算法能够选择一种规避分支的,那么还是建议您先考虑选择其他算法。

感谢来访。

这种想法好呀…借鉴

版主好人啊,小弟拜谢了

版主好人,还有一个弱智的问题,想请教你一下。
我在kernel函数里面设置了一个int a ,并且会对它操作,那么不同线程之间这个a的值会不会造成相互之间影响

LZ您好:

kernel中定义的int a是各个线程私有的,线程间并无干扰。

kernel中定义的__shared__的变量和数组是block内线程共享的。

global memory中的变量和数组是全部线程共享的。

后两者需要考虑线程间操作的影响,而第一个不用管。

祝您好运~