编译器支持SSE矢量类型的成员,如m128_f32 [x]

时间:2013-11-11 08:45:21

标签: visual-c++ clang sse

这可能听起来很愚蠢,但有没有办法激活对SSE矢量类型内部成员的支持?

我知道这在MSVC上运行良好,我在论坛上发现了一些评论,如this。 问题是,我是否可以至少在没有创建自己的工会的情况下在CLang上激活它?

谢谢

[编辑,解决方法]

目前我决定创建一个vec4类型来帮助我。 这是代码

#include <emmintrin.h>
#include <cstdint>


#ifdef _WIN32
typedef __m128 vec4;
typedef __m128i vec4i;
typedef __m128d vec4d;
#else
typedef union __declspec(align(16)) vec4{
    float m128_f32[4];
    uint64_t m128_u64[2];
    int8_t m128_i8[16];
    int16_t m128_i16[8];
    int32_t m128_i32[4];
    int64_t m128_i64[2];
    uint8_t m128_u8[16];
    uint16_t m128_u16[8];
    uint32_t m128_u32[4];
} vec4;
typedef union __declspec(align(16)) vec4i{
    uint64_t m128i_u64[2];
    int8_t m128i_i8[16];
    int16_t m128i_i16[8];
    int32_t m128i_i32[4];
    int64_t m128i_i64[2];
    uint8_t m128i_u8[16];
    uint16_t m128i_u16[8];
    uint32_t m128i_u32[4];
} vec4i;

typedef union __declspec(align(16)) vec4d{
    double m128d_f64[2];
} vec4d;
#endif

1 个答案:

答案 0 :(得分:3)

在最近的铿锵声中,这就是Just Works,你根本不需要做任何事情:

#include <immintrin.h>

float foo(__m128 x) {
  return x[1];
}

AFAIK它也适用于最近的GCC版本。

但是,我应该注意以下几点:

  • 仔细考虑您是否真的需要在向量代码中进行逐元素访问。如果你可以保持你的运营,他们几乎肯定会更有效率。

  • 如果您确实需要进行大量的车道或水平操作,并且您不需要可移植性,请考虑使用Clang extended vectors(或“OpenCL”向量“)而不是基本的SSE内在类型。你可以像__m128和朋友一样将它们传递给内在函数,但它们也有更好的语法用于矢量标量运算,通道运算,矢量文字等。