问题描述
我想知道在使用 SSE2 时如何有效地加载和存储变量。
在此示例中,我想将 pclmulqdq
指令(进行较少的乘法,对多项式算术有用)与普通 C 函数进行对比,因此我需要与标准函数相同的“调用约定”。
a 和 b 是 16 位有效位,结果将有 32 位有效位
#include <wmmintrin.h>
int GFpoly_mul_i(int a,int b) {
__m128i xa = _mm_loadu_si128( (__m128i*) a);
__m128i xb = _mm_loadu_si128((__m128i*) b);
__m128i r = _mm_clmulepi64_si128(xa,xb,0);
_MM_ALIGN16 int result[4];
__m128i* ptr_result = (__m128i*)result;
_mm_store_si128(ptr_result,r);
return result[0];
}
解决方法
使用 _mm_cvtsi128_si32
可以轻松地从向量的最低部分提取 32 位整数:
return _mm_cvtsi128_si32(r);
将 32 位整数加载到向量的最低部分可以通过“相反”操作来完成,_mm_cvtsi32_si128
:
__m128i xa = _mm_cvtsi32_si128(a);
无法使用 a
将整数 _mm_loadu_si128( (__m128i*) a)
加载到向量中,这会将 a
转换为指针并取消引用它(读取 128 位向量),但是 {{1} } 只是一个整数值,并没有指向任何有用的地方,除非是偶然的。