【问题标题】:Bitwise operations between 128-bit integers128 位整数之间的按位运算
【发布时间】:2013-09-10 18:02:37
【问题描述】:

我有一个关于使用 128 位寄存器来提高代码速度的问题。考虑以下 C/C++ 代码:我定义了两个 unsigned long long ints ab,并给它们一些值。

unsigned long long int a = 4368, b = 56480;

然后,我要计算

a & b;

这里a在计算机中表示为一个64位数字4369 = 100010001001b = 56481 = 1101110010100001也一样,我计算a & b,它仍然是一个64位数字,由bit-by给出-a 和 b 之间的位逻辑与:

a & b = 1000000000001

我的问题如下:计算机是否有一个 128 位寄存器,我可以在其中执行上述操作,但使用 128 位整数而不是 64 位整数,并且具有相同的计算机时间?更清楚一点:我想通过使用 128 位数字而不是 64 位数字在我的代码中获得两倍的速度,例如。 G。我想用相同的计算机时间计算 128 个 AND 而不是 64 个 AND(每个位一个 AND)。如果这是可能的,你有一个代码示例吗?我听说 SSE 注册商可能会这样做,但我不确定。

【问题讨论】:

    标签: c bit-manipulation sse logical-operators


    【解决方案1】:

    是的,SSE2 有一个 128 位的按位与 - 您可以通过 C 或 C++ 中的内在函数来使用它,例如

    #include "emmintrin.h"          // SSE2 intrinsics
    
    __m128i v0, v1, v2;             // 128 bit variables
    
    v2 = _mm_and_si128(v0, v1);     // bitwise AND
    

    或者你可以直接在汇编器中使用它——指令是PAND

    您甚至可以在具有 AVX2 的 Haswell 和更高版本的 CPU 上执行 256 位与运算:

    #include "immintrin.h"          // AVX2 intrinsics
    
    __m256i v0, v1, v2;             // 256 bit variables
    
    v2 = _mm256_and_si256(v0, v1);  // bitwise AND
    

    本例对应的指令为VPAND

    【讨论】:

    • 亲爱的保罗,感谢您的回答。你知道如何将两个 64 位数字 unsigned long long int a, b 转换为一个 __m128i 数字吗?我一直在看英特尔手册,但找不到。至于 SSE2 寄存器,我是否必须假设所有现代计算机都有它?我是否必须添加编译标志才能启用 SSE2?谢谢
    • @user2138251 是的,所有 x86 CPU,因为第一个具有一些 SIMD 指令集的 CPU 将包含该指令集以实现向后兼容。因此 Pentium 4 的所有 Intel CPU 都将具有 SSE2。未来你甚至可以使用 AVX-512 进行 512 位操作
    • @user2138251:您可以使用 _mm_set_epi64x 内在函数将 2 x 64 位整数加载到 128 位向量中。过去 10 多年左右的任何 Intel/AMD CPU 都具有最低 SSE2。编译时可能需要在命令行中添加-msse2
    猜你喜欢
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多