Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将int64_t=float*int64_t标量转换为矢量码并返回?_C++_X86_Simd_Intrinsics - Fatal编程技术网

C++ 如何将int64_t=float*int64_t标量转换为矢量码并返回?

C++ 如何将int64_t=float*int64_t标量转换为矢量码并返回?,c++,x86,simd,intrinsics,C++,X86,Simd,Intrinsics,我想转换这个标量代码: int64_t res = floatValue * int64Value; 使用SSE/SIMD(使用-march=nocona构建),然后将值返回到float: float finalRes = res; 可能吗?我会这样做: __m128 res = _mm_mul_ps(floatValue4, int64Value4); __m128i res1 = _mm_cvttps_epi64(res); __m128i res2 = _mm_cvttps_epi64

我想转换这个标量代码:

int64_t res = floatValue * int64Value;
使用
SSE/SIMD
(使用
-march=nocona
构建),然后将值返回到float:

float finalRes = res;
可能吗?我会这样做:

__m128 res = _mm_mul_ps(floatValue4, int64Value4);
__m128i res1 = _mm_cvttps_epi64(res);
__m128i res2 = _mm_cvttps_epi64(_mm_movehl_epi64(res, res));

但我似乎找不到目标平台的
\u mm\u cvttps\u epi64
\u mm\u movehl\u epi64

不确定您的期望是什么。您是否尝试查看编译器生成的内容:?从我的观点来看,这看起来不错。
\u mm\u blendv\u epi16
很容易在SSE2上模拟;不要使用
\u mm\u blendv\u epi16(x,0x88)
,而是尝试类似于
\u m128i tmp=\u mm\u set\u epi16(0,~0,~0,~0,~0,~0,~0,~0,~0,~0,~0)的方法__m128i xL=_mm_或_si128(_mm_和_si128(m,x),_mm_和非_si128(m,_mm_castpd_si128(_mm_set1_pd(0x0010000000000000)))。对于0x33更容易,因为其中一个向量都是零:
\u mm\u和\u si128(xH,\u mm\u set\u epi16(~0,~0,0,0,~0,~0,~0,~0,0,0))
。确实需要64位整数吗?在上一个问题()中,整数常量转换为编译时常量浮点,这比使用int64所做的任何事情都要高效。在AVX-512之前,没有单指令FPint64 SIMD转换(仅标量),也没有int64 SIMD乘法。使用
\u mm\u movehl\u epi64(v,v)
只需要
\u mm\u unpachi\u epi64(v,v)
,或者如果您只需要结果的下半部分,那么您已经使用的
\u mm\u srli\u si128(v,8)
也可以工作。