128 位整数之间的按位运算
Posted
技术标签:
【中文标题】128 位整数之间的按位运算【英文标题】:Bitwise operations between 128-bit integers 【发布时间】:2013-09-10 18:02:37 【问题描述】:我有一个关于使用 128 位寄存器来提高代码速度的问题。考虑以下 C/C++ 代码:我定义了两个 unsigned long long int
s a
和 b
,并给它们一些值。
unsigned long long int a = 4368, b = 56480;
然后,我要计算
a & b;
这里a
在计算机中表示为一个64位数字4369 = 100010001001
,b = 56481 = 1101110010100001
也一样,我计算a & b
,它仍然是一个64位数字,由bit-by给出-a 和 b 之间的位逻辑与:
a & b = 1000000000001
我的问题如下:计算机是否有一个 128 位寄存器,我可以在其中执行上述操作,但使用 128 位整数而不是 64 位整数,并且具有相同的计算机时间?更清楚一点:我想通过使用 128 位数字而不是 64 位数字在我的代码中获得两倍的速度,例如。 G。我想用相同的计算机时间计算 128 个 AND 而不是 64 个 AND(每个位一个 AND)。如果这是可能的,你有一个代码示例吗?我听说 SSE 注册商可能会这样做,但我不确定。
【问题讨论】:
【参考方案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
。以上是关于128 位整数之间的按位运算的主要内容,如果未能解决你的问题,请参考以下文章