C – 如何使用GCC SSE向量扩展访问向量元素

通常我使用以下类型处理3D矢量:

typedef vec3_t float[3];

使用smth初始化向量.喜欢:

vec3_t x_basis = {1.0, 0.0, 0.0};
vec3_t y_basis = {0.0, 1.0, 0.0};
vec3_t z_basis = {0.0, 0.0, 1.0};

并使用smth访问它们.喜欢:

x_basis[X] * y_basis[X] + ...

现在我需要一个使用SSE指令的矢量算术.我有以下代码:

typedef float v4sf __attribute__ ((mode(V4SF)))
int main(void)
{
    v4sf   a,b,c;
    a = (v4sf){0.1f,0.2f,0.3f,0.4f};
    b = (v4sf){0.1f,0.2f,0.3f,0.4f};
    c = (v4sf){0.1f,0.2f,0.3f,0.4f};
    a = b + c;
    printf("a=%f \n", a);
    return 0;
}

GCC支持这种方式.但…
首先,它给我0.00000的结果.其次,我无法访问这些载体的元素.
我的问题是:我如何访问这些载体的元素?我需要smth.像[0]访问X元素,[1]访问Y元素等

PS:我使用以下代码编译此代码:

gcc -msse testgcc.c -o testgcc
最佳答案
访问元素的安全和推荐方法是使用union而不是指针类型punning,这会欺骗编译器的别名检测机制,并可能导致代码不稳定.

union Vec4 {
    v4sf v;
    float e[4];
};

Vec4 vec;
vec.v = (v4sf){0.1f,0.2f,0.3f,0.4f};
printf("%f %f %f %f\n", vec.e[0], vec.e[1], vec.e[2], vec.e[3]);

转载注明原文:C – 如何使用GCC SSE向量扩展访问向量元素 - 代码日志