C rotl32备选方案

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跃点)

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跃点)
{
返回(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