使用SSE2内在存储或提取标量int结果的更好方法

我想知道在使用 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];
}

回答

从向量的最低部分提取 32 位整数可以很容易地完成_mm_cvtsi128_si32

return _mm_cvtsi128_si32(r);

可以使用“相反”操作将 32 位整数加载到向量的最低部分_mm_cvtsi32_si128

__m128i xa = _mm_cvtsi32_si128(a);

a无法使用将整数加载到向量中_mm_loadu_si128( (__m128i*) a),这将a转换为指针并取消引用它(读取 128 位向量),但a它只是一个整数值,不会指向任何有用的地方,除非可能是偶然的。


以上是使用SSE2内在存储或提取标量int结果的更好方法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>