访问编译器中的__m128字段

时间:2013-10-25 06:46:24

标签: visual-c++ g++ sse icc

我注意到,可以在__m128中使用索引访问gcc字段,而不使用union技巧。

__m128 t;

float r(t[0] + t[1] + t[2] + t[3]);

我也可以像数组一样加载__m128

__m128 t{1.f, 2.f, 3.f, 4.f};

这与gcc的向量扩展一致。但是,这些可能在其他地方不可用。 intel编译器和msvc是否支持加载和访问功能?

2 个答案:

答案 0 :(得分:3)

如果您希望代码在其他编译器上工作,请不要使用这些GCC扩展。使用set / load / store内在函数。 _mm_setr_ps可用于设置常量值,但不应在循环中使用。要访问元素,我通常先将值存储到数组中,然后读取数组。

如果你有一个数组a,你应该用

读取/存储它
__m128 t = _mm_loadu_ps(a);
_mm_storeu_ps(a, t);

如果阵列是16字节对齐的,您可以使用对齐的加载/存储,这在较新的系统上稍快一些,但在较旧的系统上要快得多。

__m128 t = _mm_load_ps(a);
_mm_store_ps(a, t);

要在堆栈上获得16字节对齐的内存,请使用

__declspec(align(16)) const float a[] = ...//MSVC
__attribute__((aligned(16))) const float a[] ...//GCC, ICC

对于16字节对齐的dynamic arrays use

float *a = (float*)_mm_malloc(sizeof(float)*n, 16); //MSVC, GCC, ICC, MinGW 

答案 1 :(得分:2)

要加载__m128,您可以编写_mm_setr_ps(1.f, 2.f, 3.f, 4.f),由GCC,ICC,MSVC和clang支持。

据我所知,clang和最新版本的GCC支持按索引访问__m128字段。我不知道如何在ICC或MSVC中这样做。我想_mm_extract_ps适用于所有4个编译器,但它的返回类型是疯狂的,这使得使用起来很痛苦。