有没有办法在没有IF语句的情况下编写下一个表达式? if((b& 1)!= 0)

时间:2014-09-30 21:16:43

标签: c cuda gpu

我在GPU上编程,我想通过替换这个表达来加快我的实现

if ((b & 1) != 0)

与等效,但不使用IF语句。 代码用C语言编写,这个调用在CUDA内核函数中。

编辑,完整功能如下,还有一个IF语句消除如下:

unsigned char p = 0;
unsigned char counter;
unsigned char carry;
for (counter = 0; counter < 8; counter++)
{
    if ((b & 1) != 0)
    {
         p ^= a;
    }
    carry = (unsigned char)(a & 0x80);
    a <<= 1;
    if (carry != 0)
    {
        a ^= 0x1B; 
    }
    b >>= 1;
}
return p;

很抱歉没有回答,这是该功能的完整代码块。现在我注意到我有另一个IF声明,我道歉,有点累,缺少东西。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

从技术上讲(但不确定它是否能提高性能,反之亦然)你可以替换

if ((b & 1) != 0)
{
     p ^= a;
}

p ^= a * (b & 1);

类似地,

carry = (unsigned char)(a & 0x80);
a <<= 1;
if (carry != 0)
{
    a ^= 0x1B; 
}

可以替换为

carry = (unsigned char)(a >> 7);
a <<= 1;
a ^= 0x1B * carry;

假设[两个补码]算术,我们可以摆脱可能昂贵的乘法:

x = (b & 1) ^ 1; // 0 if last bit of b is set, 1 otherwise
x -= 1;          // 0->FF, 1->0
p ^= a & x;

或只是

p ^= a & (((b & 1) ^ 1) - 1);

carry = a >> 7;
a <<= 1;
a ^= 0x1B & ((carry ^ 1) - 1);

免责声明:用一张纸完成,应该进行正确性测试。)