这可能听起来很愚蠢,但有没有办法激活对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
答案 0 :(得分:3)
在最近的铿锵声中,这就是Just Works,你根本不需要做任何事情:
#include <immintrin.h>
float foo(__m128 x) {
return x[1];
}
AFAIK它也适用于最近的GCC版本。
但是,我应该注意以下几点:
仔细考虑您是否真的需要在向量代码中进行逐元素访问。如果你可以保持你的运营,他们几乎肯定会更有效率。
如果您确实需要进行大量的车道或水平操作,并且您不需要可移植性,请考虑使用Clang extended vectors(或“OpenCL”向量“)而不是基本的SSE内在类型。你可以像__m128
和朋友一样将它们传递给内在函数,但它们也有更好的语法用于矢量标量运算,通道运算,矢量文字等。