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
Również znacznie mniej czytelny :) – LtWorf
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. –