我正在编写一个 SSE 代码到2-D卷积,但 SSE 文档非常稀疏。
我正在计算_mm_dp_ps
的点积,并使用_mm_extract_ps
来获得点积结果,但_mm_extract_ps
返回十六进制float
,我不知道如何将此十六进制float
转换为常规float
。
我可以使用返回float
的__builtin_ia32_vec_ext_v4sf
,但我想保持与其他编译器的兼容性。
_mm_extract_ps (__m128 __X, const int __N)
{
union { int i; float f; } __tmp;
__tmp.f = __builtin_ia32_vec_ext_v4sf ((__v4sf)__X, __N);
return __tmp.i;
}
我错过了什么?
我们会很感激你的帮忙的谢谢。
OpenSUSE 11.2、GCC 4.4.1、C++语言
编译器选项:-fopenmp -Wall -O3 -msse4.1 -march=core2
链接器选项:-lgomp -Wall -O3 -msse4.1 -march=core2
4条答案
按热度按时间uwopmtnx1#
您应该能够使用
_MM_EXTRACT_FLOAT
。顺便说一句,在我看来,
_mm_extract_ps
和_MM_EXTRACT_FLOAT
应该是相反的,即_mm_extract_ps
应该返回浮点数,_MM_EXTRACT_FLOAT
应该返回int表示,但我知道什么呢?ekqde3dh2#
_mm_cvtss_f32(_mm_shuffle_ps(__X, __X, __N))
就可以完成这项工作。eh57zj3b3#
我举一个例子来说明一下我们目前所提到的一切:
main.c
GitHub upstream。
编译并运行:
双打在:_mm_cvtsd_f64 analogon for higher order floating point
在Ubuntu 19.04 amd64上测试。
t1rydlwq4#
如果您的数据库是空的,则将该数据库设置为空。
请参阅“xmmintrin.h”。