128 位整数之间的按位运算

Posted

技术标签:

【中文标题】128 位整数之间的按位运算【英文标题】:Bitwise operations between 128-bit integers 【发布时间】: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 注册商可能会这样做,但我不确定。

【问题讨论】:

【参考方案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 位整数之间的按位运算的主要内容,如果未能解决你的问题,请参考以下文章

9. 位运算符

位掩码 - C中的按位运算

python-opencv-图像的按位运算

c语言的按位运算符怎么操作!?

Apache Pig 中的按位运算?

Masm 常量的按位运算