C rotl32备选方案
C语言中的C rotl32备选方案,c,opencl,C,Opencl,C语言中的rotl32是否有替代方案 我发现: 但仍然在努力得到一个优化的 我的代码: k0 = rotl32 ((k3 ^ k2 ^ k ^ k0), 1u) 我认为这是最好的便携式选择: uint32_t rotl32(uint32_t var, uint32_t hops) { return (var << hops) | (var >> (32 - hops)); } uint32\u t旋转32(uint32\u t变量,uint32\u t跃点)
rotl32
是否有替代方案
我发现:
但仍然在努力得到一个优化的
我的代码:
k0 = rotl32 ((k3 ^ k2 ^ k ^ k0), 1u)
我认为这是最好的便携式选择:
uint32_t rotl32(uint32_t var, uint32_t hops)
{
return (var << hops) | (var >> (32 - hops));
}
uint32\u t旋转32(uint32\u t变量,uint32\u t跃点)
{
返回(var>(32跳));
}
dromtrund发布了一个很好的便携式解决方案:
uint32_t rotl32(uint32_t var, uint32_t hops) {
return (var << hops) | (var >> (32 - hops));
}
这两个函数都使用GCC4.9和更高版本、clang 3.5和更高版本以及ICC17编译为最佳代码,可以通过验证
John Regehr在这个问题上有自己的观点。你的问题中有opencl标记,所以有一个内核
__kernel void rotateGpu(__global unsigned int * a,__global unsigned int * b)
{
int idx = get_global_id(0);
unsigned int a0=a[idx];
for(int i=0;i<100;i++)
a0=rotate(a0,1280u);
b[idx] = rotate(a0,1280u);
}
输入:
buf[0] = 80;
buf[1] = 12;
buf[2] = 14;
buf[3] = 5 ;
buf[4] = 70;
输出:
320
48
56
20
280
这不适用于
跃点==0
。无需测试即可修复它:返回(var>((32-hops)和31))代码>什么会导致此失败?我们向右移动超出边界,移动从左侧输入0。在gcc 4.8.5中工作正常?如果hops==0
,var>>(32-hops)
具有未定义的行为。在x86处理器上,它可能会计算var>>0
,但在其他处理器上,它可能会计算其他值,例如var>>32
,该值也可以计算为0,但C标准不能保证这些是唯一可能的行为(不幸的是)。事实上,任何事情都是可能的,所以必须避免这种情况。opencl具有旋转功能。您已经找到的答案有什么问题?“…试图得到一个优化的”表明它不是最优的,但是如何做到呢?它的执行速度比opencl旋转函数快吗?但是我在这里写的是opencl旋转函数,刚刚测试过。也许是编译器优化它的能力。也许nvidia有不同的时间复杂度或时间延迟。你能提供一个使用示例吗?添加了一个向左旋转两步的示例。我不明白,你能像我上面的代码那样简单吗?
buf[0] = 80;
buf[1] = 12;
buf[2] = 14;
buf[3] = 5 ;
buf[4] = 70;
320
48
56
20
280