2011-01-04 9 views
5

Ich sehe einen Code wie folgt:.SSE (SIMD Extensions) Unterstützung in 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); 
} 

Dieser Code baut fein und arbeitet expectedly gcc (es ist inbuild SSE/MMX-Erweiterungen und Vektordatentypen dieser Code tut a. SIMD-Vektoraddition mit 4 Einzel Schwimmer

ich möchte im Detail verstehen, was sich jedes Schlüsselwort/Funktionsaufruf auf dieser typedef Linie bedeutet und tut:

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

Was die VECTOR_SIZE ist () Funktionsrückgabe;

Was ist das __attribute__ Schlüsselwort für

Hier ist der Schwimmer Datentyp Sein Typ definiert Typ vfsf?

Ich verstehe den Rest Teil.

Dank,

-AD

Antwort

8

__attribute__ GCCs ist Art und Weise Funktionalität des Compilers des Aussetzens, die nicht in der C oder C++ Standards ist. __attribute__((vector_size(x))) weist GCC an, den Typ als Vektor der Größe x zu behandeln. Für SSE ist dies 16 Bytes.

Allerdings würde ich vorschlagen, die __m128, __m128i oder __m128d Typen in den verschiedenen <*mmintrin.h> Header zu finden. Sie sind über Compiler portabler.

+0

Auch weg weniger lesbar :) – LtWorf

+0

Die intrinsics sind nur portabler zu MSVC. Die Vektorerweiterungen funktionieren für GCC, Clang und ICC. Sie sind auch nicht von der Hardware abhängig. Dies bedeutet, dass Sie sie auch für z. B. ARM verwenden können. Sie können die Macht der Vektorerweiterungen von ihnen [hier] sehen (https://Stackoverflow.com/a/48283672/2542702), die ich für GCC und Clang sowohl auf x86 als auch auf ARM verklagte. Es wäre leicht, sie für ICC zu erweitern, hätte aber meine Antwort länger gemacht. –