2011-01-04 10 views
5

widzę kod jak poniżej:.(rozszerzenia SIMD) SSE wsparcie w 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); 
} 

Kod ten tworzy w porządku i działa expectedly używając gcc (to inbuild rozszerzenia SSE/MMX i typy danych wektorowych ten kod robi a. SIMD dodawanie wektorów za pomocą 4 pojedyncze pływaków

chcę zrozumieć szczegółowo co robi każdego słowa kluczowego/wywołanie funkcji na tej linii typedef oznacza i robi:

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

Jaki jest vector_size () funkcja return;

Co jest kluczowe dla __attribute__

Oto istota pływak typ danych Typ zdefiniowany vfsf typ?

Rozumiem resztę.

Dzięki,

-AD

Odpowiedz

8

__attribute__ jest GCCs sposób odsłaniając funkcjonalność z kompilatora, który nie jest w C lub C++ standardy. __attribute__((vector_size(x))) instruuje GCC, aby traktował typ jako wektor o rozmiarze x. W przypadku SSE jest to 16 bajtów.

Proponuję jednak użyć typów __m128, __m128i lub __m128d znajdujących się w różnych nagłówkach <*mmintrin.h>. Są bardziej przenośne w kompilatorach.

+0

Również znacznie mniej czytelny :) – LtWorf

+0

Wewnętrzne są bardziej przenośne dla MSVC. Rozszerzenia wektorowe działają dla GCC, Clang i ICC. Nie zależą również od sprzętu. Oznacza to, że możesz ich używać również na przykład do ARM. Możesz zobaczyć moc wektorów ich rozszerzeń [tutaj] (https://stackoverflow.com/a/48283672/2542702), które pozwany dla GCC i Clang na obu x86 i ARM. Łatwo byłoby również rozszerzyć je na ICC, ale odpowiedź na to pytanie byłaby dłuższa. –