0

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

我知道这在 MSVC 上运行良好,而且我在论坛上发现了一些评论,所以就像这样。问题是,我至少可以在不创建自己的工会的情况下在 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
4

1 回答 1

3

在最近的 clangs 中,这个 Just Works 不需要你做任何事情:

#include <immintrin.h>

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

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

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

  • 仔细考虑您是否真的需要在矢量代码中进行逐元素访问。如果您可以让您的操作保持一致,那么它们几乎肯定会显着提高效率。

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

于 2013-11-11T11:32:40.233 回答