2011-01-04 30 views
5

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

Trả lời

8

__attribute__ là GCC cách phơi bày chức năng từ trình biên dịch đó không phải là trong thư mục C hoặc tiêu chuẩn C++. __attribute__((vector_size(x))) hướng dẫn GCC xử lý loại đó dưới dạng vectơ có kích thước x. Đối với SSE, giá trị này là 16 byte.

Tuy nhiên, tôi khuyên bạn nên sử dụng các loại __m128, __m128i hoặc __m128d được tìm thấy trong các tiêu đề <*mmintrin.h> khác nhau. Chúng di động nhiều hơn trên các trình biên dịch.

+0

Ngoài ra cách ít có thể đọc được :) – LtWorf

+0

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. –

Các vấn đề liên quan