Поддержка SSE (расширения SIMD) в gcc - PullRequest
5 голосов
/ 04 января 2011

Я вижу код, показанный ниже:

#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 и векторные типы данных. Этот код выполняет добавление вектора SIMD с использованием 4одиночные числа с плавающей запятой.

Я хочу подробно понять, что означает и что делает каждое ключевое слово / вызов функции в этой строке typedef:

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

Что такое функция vector_size () return;

Что такое ключевое слово __attribute__ для

Вот тип данных с плавающей точкой, определенный как тип vfsf?

Я понимаю остальную часть.

спасибо

-AD

1 Ответ

9 голосов
/ 04 января 2011

__attribute__ - это способ представления GCC компилятором, который не соответствует стандартам C или C ++.__attribute__((vector_size(x))) указывает GCC обрабатывать тип как вектор размера x.Для SSE это 16 байтов.

Однако я бы предложил использовать типы __m128, __m128i или __m128d в различных заголовках <*mmintrin.h>.Они более переносимы среди компиляторов.

...