0

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

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

然后,我想计算

a & b;

这里a在计算机中表示为一个 64 位数字4369 = 100010001001,对于b = 56481 = 1101110010100001, 和 I 计算a & b也是如此,它仍然是一个 64 位数字,由 a 和 b 之间的逐位逻辑 AND 给出:

a & b = 1000000000001

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

4

1 回答 1

6

是的,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.

您甚至可以在具有 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

于 2013-09-10T18:53:12.327 回答