我在GPU上编程,我想通过替换这个表达来加快我的实现
if ((b & 1) != 0)
与等效,但不使用IF语句。 代码用C语言编写,这个调用在CUDA内核函数中。
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声明,我道歉,有点累,缺少东西。
感谢您的帮助。
答案 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);
(免责声明:用一张纸完成,应该进行正确性测试。)