如何在C/C++中使用_mm_extract_ps SSE GCC instrinc函数将十六进制浮点转换为浮点

kr98yfug  于 2022-11-12  发布在  C/C++
关注(0)|答案(4)|浏览(206)

我正在编写一个 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.2GCC 4.4.1C++语言

编译器选项:-fopenmp -Wall -O3 -msse4.1 -march=core2
链接器选项:-lgomp -Wall -O3 -msse4.1 -march=core2

uwopmtnx

uwopmtnx1#

您应该能够使用_MM_EXTRACT_FLOAT
顺便说一句,在我看来,_mm_extract_ps_MM_EXTRACT_FLOAT应该是相反的,即_mm_extract_ps应该返回浮点数,_MM_EXTRACT_FLOAT应该返回int表示,但我知道什么呢?

ekqde3dh

ekqde3dh2#

_mm_cvtss_f32(_mm_shuffle_ps(__X, __X, __N))就可以完成这项工作。

eh57zj3b

eh57zj3b3#

我举一个例子来说明一下我们目前所提到的一切:
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);
    }
}

GitHub upstream
编译并运行:

gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out

双打在:_mm_cvtsd_f64 analogon for higher order floating point
在Ubuntu 19.04 amd64上测试。

t1rydlwq

t1rydlwq4#

如果您的数据库是空的,则将该数据库设置为空。
请参阅“xmmintrin.h”。

相关问题