如何使用_mm_extract_ps sse gcc instrinc函数将十六进制的浮点转换为c/c ++的浮子
-
01-10-2019 - |
题
我正在将SSE代码写入2D卷积,但SSE文档非常稀疏。我正在用_mm_dp_ps计算点产品,并使用_mm_extract_ps获取点产品结果,但是_mm_extract_ps返回代表浮点的十六进制,我不知道如何将此HEX 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
解决方案
你应该能够使用 _MM_EXTRACT_FLOAT
.
顺便说一句,在我看来 _mm_extract_ps
和 _MM_EXTRACT_FLOAT
应该相反,即 _mm_extract_ps
应该返回浮标 _MM_EXTRACT_FLOAT
应该返回int表示,但是我知道什么。
其他提示
_mm_cvtss_f32(_mm_shuffle_ps(__X, __X, __N))
将完成这项工作。
只是说明到目前为止提到的所有内容:
main.c
#include <assert.h>
#include <x86intrin.h>
int main(void) {
/* 32-bit. */
{
__m128 x = _mm_set_ps(1.5f, 2.5f, 3.5f, 4.5f);
/* _MM_EXTRACT_FLOAT */
float f;
_MM_EXTRACT_FLOAT(f, x, 3);
assert(f == 1.5f);
_MM_EXTRACT_FLOAT(f, x, 2);
assert(f == 2.5f);
_MM_EXTRACT_FLOAT(f, x, 1);
assert(f == 3.5f);
_MM_EXTRACT_FLOAT(f, x, 0);
assert(f == 4.5f);
/* _mm_cvtss_f32 + _mm_shuffle_ps */
assert(_mm_cvtss_f32(x) == 4.5f);
assert(_mm_cvtss_f32(_mm_shuffle_ps(x, x, 1)) == 3.5f);
assert(_mm_cvtss_f32(_mm_shuffle_ps(x, x, 2)) == 2.5f);
assert(_mm_cvtss_f32(_mm_shuffle_ps(x, x, 3)) == 1.5f);
}
/* 64-bit. */
{
__m128d x = _mm_set_pd(1.5, 2.5);
/* _mm_cvtsd_f64 + _mm_unpackhi_pd */
assert(_mm_cvtsd_f64(x) == 2.5);
assert(_mm_cvtsd_f64(_mm_unpackhi_pd(x, x)) == 1.5);
}
}
编译和运行:
gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out
提到的双打: _mm_cvtsd_f64高阶浮点的类似物
在Ubuntu 19.04 AMD64上进行了测试。
extern void _mm_store_ss(float*,__m128);
请参阅'xmmintrin.h。
不隶属于 StackOverflow