我有一个关于使用 128 位寄存器来提高代码速度的问题。考虑以下 C/C++ 代码:我定义了两个 unsigned long long int
a
和 b
,并给它们一些值。
unsigned long long int a = 4368, b = 56480;
然后,我要计算
a & b;
这里a
在计算机中表示为64位数字4369 = 100010001001
,同样b = 56481 = 1101110010100001
,然后我计算 a & b
,它仍然是一个 64 位数字,由 a 和 b 之间的逐位逻辑与给出:
a & b = 1000000000001
我的问题如下:计算机是否有一个 128 位寄存器,我可以在其中执行上述操作,但使用 128 位整数而不是 64 位整数,并且计算机时间相同?更清楚一点:我想通过使用 128 位数字而不是 64 位数字,将我的代码速度提高两倍,e。 G。我想用相同的计算机时间计算 128 个 AND 而不是 64 个 AND(每个位一个 AND)。如果可能的话,你有代码示例吗?我听说上交所注册人可能会这样做,但我不确定。
最佳答案
是的,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 位 AND:
#include "immintrin.h" // AVX2 intrinsics
__m256i v0, v1, v2; // 256 bit variables
v2 = _mm256_and_si256(v0, v1); // bitwise AND
此时对应的指令是VPAND
。
关于c - 128 位整数之间的按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18725928/