使用 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];
}

解决方法

使用 _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} } 只是一个整数值,并没有指向任何有用的地方,除非是偶然的。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...