用户
 找回密码
 立即注册
316312365 该用户已被删除
发表于 2013-12-1 17:28:44
102746
小弟菜鸟,最近在做有关图像处理方面的内容。遇到一个问题,是关于颜色空间转化的。在转化过程中,必须要用到判断语句,而且是三个不同条件。但是kernel最讨厌的就是分支换乱,不知都各路大神能不能帮帮小弟。
使用道具 举报 回复
发表于 2013-12-2 09:37:08
楼主您好:

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

使用道具 举报 回复 支持 反对
发表于 2013-12-2 09:41:06
横扫千军 发表于 2013-12-2 09:37
楼主您好:

这个是要看情况的,当您已经确定前提算法无可更改的情况下,那么就大胆的用吧。因为此时:

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

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%的性能下降。

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

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

感谢来访。
使用道具 举报 回复 支持 反对
发表于 2013-12-2 15:39:52
横扫千军 发表于 2013-12-2 09:41
您可以参考我给出的这个例子:

bool cond = ....;

这种想法好呀...借鉴
使用道具 举报 回复 支持 反对
发表于 2013-12-2 19:40:21
横扫千军 发表于 2013-12-2 09:37
楼主您好:

这个是要看情况的,当您已经确定前提算法无可更改的情况下,那么就大胆的用吧。因为此时:

版主好人啊,小弟拜谢了
使用道具 举报 回复 支持 反对
发表于 2013-12-2 20:03:45
横扫千军 发表于 2013-12-2 09:41
您可以参考我给出的这个例子:

bool cond = ....;

版主好人,还有一个弱智的问题,想请教你一下。
我在kernel函数里面设置了一个int a  ,并且会对它操作,那么不同线程之间这个a的值会不会造成相互之间影响
使用道具 举报 回复 支持 反对
发表于 2013-12-2 21:55:12
316312365 发表于 2013-12-2 20:03
版主好人,还有一个弱智的问题,想请教你一下。
我在kernel函数里面设置了一个int a  ,并且会对它操作, ...

LZ您好:

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

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

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

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

祝您好运~
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册