gpt4 book ai didi

c - 有没有办法在不使用 IF 语句的情况下编写下一个表达式?如果 ((b & 1) != 0)

转载 作者:行者123 更新时间:2023-11-30 21:37:49 25 4
gpt4 key购买 nike

我正在 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 语句,我很抱歉,有点累,缺少一些东西。

感谢您的帮助。

最佳答案

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

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);

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

关于c - 有没有办法在不使用 IF 语句的情况下编写下一个表达式?如果 ((b & 1) != 0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26130255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com