tôi nhìn thấy một mã như dưới đây:.(phần mở rộng SIMD) SSE hỗ trợ trong 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);
}
Mã này tạo tốt và các công trình dự kiến sử dụng gcc (nó inbuild mở rộng SSE/MMX và các kiểu dữ liệu vector mã này được thực hiện . một SIMD vector Ngoài sử dụng 4 nổi đơn
tôi muốn hiểu một cách chi tiết những gì mỗi từ khóa/gọi hàm trên dòng typedef điều này có nghĩa và làm:
typedef float v4sf __attribute__ ((vector_size(sizeof(float)*VECTOR_SIZE)));
các vector_size là gì () trả về hàm;
được gì từ khóa __attribute__
cho
Dưới đây là phao kiểu dữ liệu con người kiểu định nghĩa vfsf loại?
Tôi hiểu phần còn lại.
cảm ơn,
-AD
Ngoài ra cách ít có thể đọc được :) – LtWorf
Nội tại chỉ di động hơn với MSVC. Các phần mở rộng vector làm việc cho GCC, Clang và ICC. Chúng cũng không phụ thuộc vào phần cứng. Điều này có nghĩa là bạn có thể sử dụng chúng cho ví dụ như ARM. Bạn có thể thấy sức mạnh của các phần mở rộng vectơ của chúng [ở đây] (https://stackoverflow.com/a/48283672/2542702) mà tôi đã kiện cho GCC và Clang trên cả x86 và ARM. Thật dễ dàng để mở rộng chúng cho ICC, nhưng sẽ làm cho câu trả lời của tôi dài hơn. –