2011-01-04 23 views
5

veo un código de la siguiente manera:.(extensiones SIMD) SSE apoyo en gcc

#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); 
} 

Este código se construye muy bien y funciona como era de esperar con gcc (se inbuild extensiones SSE/MMX y tipos de datos vectoriales este código está haciendo . una suma de vectores usando SIMD 4 flotadores individuales

Quiero comprender en detalle lo que cada palabra clave/llamada a la función en esta línea typedef significa y hace:

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

Cuál es el vector_size () función de retorno;

¿Cuál es la palabra clave para __attribute__

Aquí está el flotador tipo de datos que se define el tipo de vfsf tipo?

Entiendo la parte de descanso.

gracias,

-AD

Respuesta

8

__attribute__ es GCC manera de exponer la funcionalidad del compilador que no está en la C o C++. Normas __attribute__((vector_size(x))) indica a GCC que trate el tipo como un vector de tamaño x. Para SSE esto es 16 bytes.

Sin embargo, le sugiero que utilice los tipos __m128, __m128i o __m128d que se encuentran en los diversos encabezados <*mmintrin.h>. Son más portátiles en todos los compiladores.

+0

También es menos legible :) – LtWorf

+0

Los intrínsecos son solo más portátiles para MSVC. Las extensiones vectoriales funcionan para GCC, Clang e ICC. Tampoco dependen del hardware. Esto significa que también puede usarlos para, por ejemplo, ARM. Puedes ver el poder de las extensiones vectoriales de ellos [aquí] (https://stackoverflow.com/a/48283672/2542702) que demandé para GCC y Clang en ambos, x86 y ARM. Sería fácil extenderlos para ICC también, pero hubiera hecho que mi respuesta fuera más larga. –