5

我看到如下代码:

#include "stdio.h"

#define VECTOR_SIZE         4
typedef float v4sf __attribute__ ((vector_size(sizeof(float)*VECTOR_SIZE))); 
 // vector of four single floats

typedef union f4vector
{
    v4sf    v;
    float   f[VECTOR_SIZE];
} f4vector;

void print_vector (f4vector *v)
{
    printf("%f,%f,%f,%f\n", v->f[0], v->f[1], v->f[2], v->f[3]);
}

int main()
{
    union f4vector a, b, c;

    a.v = (v4sf){1.2, 2.3, 3.4, 4.5};
    b.v = (v4sf){5., 6., 7., 8.};
    c.v = a.v + b.v;

    print_vector(&a);
    print_vector(&b);
    print_vector(&c);
}

此代码构建良好,并且使用 gcc 可以正常工作(它是内置的 SSE / MMX 扩展和向量数据类型。此代码使用 4 个单浮点数进行 SIMD 向量加法。

我想详细了解此 typedef 行上的每个关键字/函数调用的含义和作用:

typedef float v4sf __attribute__ ((vector_size(sizeof(float)*VECTOR_SIZE))); 

vector_size() 函数返回什么;

__attribute__关键字是什么

这是将浮点数据类型定义为 vfsf 类型的类型吗?

我理解剩下的部分。

谢谢,

-广告

4

1 回答 1

9

__attribute__是 GCC 从编译器公开功能的方式,而不是 C 或 C++ 标准。 __attribute__((vector_size(x)))指示 GCC 将类型视为大小为 x 的向量。对于 SSE,这是 16 个字节。

但是,我建议使用各种标头中的 __m128、__m128i 或 __m128d 类型<*mmintrin.h>。它们更易于跨编译器移植。

于 2011-01-04T18:51:32.757 回答