我有一个关于使用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-位数由a和b之间的逐位逻辑AND给出:
a & b = 1000000000001
我的问题如下:计算机是否有128位寄存器,我可以在上面进行操作,但是使用128位整数而不是64位整数,并且计算机时间相同?更清楚一点:我想通过使用128位数而不是64位数来获得代码速度的两倍,e。 G。我想用相同的计算机时间计算128个AND而不是64个AND(每个位一个AND)。如果可以的话,你有代码示例吗?我听说SSE的注册人可能会这样做,但我不确定。
答案 0 :(得分:5)
是的,SSE2具有128位按位AND - 您可以通过C或C ++中的内在函数使用它,例如
#include "emmintrin.h" // SSE2 intrinsics
__m128i v0, v1, v2; // 128 bit variables
v2 = _mm_and_si128(v0, v1); // bitwise AND
或者您可以直接在汇编程序中使用它 - 指令是PAND
。
你甚至可以在Haswell和后来的具有AVX2的CPU上执行256位AND:
#include "immintrin.h" // AVX2 intrinsics
__m256i v0, v1, v2; // 256 bit variables
v2 = _mm256_and_si256(v0, v1); // bitwise AND
在这种情况下,相应的指令是VPAND
。