2011-01-04 11 views
5

でのサポート、私は以下のようにコードを参照してください。SSE(SIMD拡張)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); 
} 

このコードは、罰金構築し、予想通りのgccを使用して動作します(それがinbuild SSE/MMX拡張機能やベクトルデータの種類だ、このコードが実行されます。 4つの浮動小数点数を使用してSIMDベクトル加算

私はこのtypedefのライン上の各キーワード/関数呼び出しを意味していないものを詳細に理解したい:。

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

vector_size(である何)関数の戻り値。

ため__attribute__キーワードはここvfsfタイプに定義された浮動小数点データ・タイプビーイングの種類は何ですか?

残りの部分は分かります。

おかげで、

〜AD

答えて

8

__attribute__は、CまたはC++の規格ではありませんコンパイラから機能を公開するのGCCの方法です。 __attribute__((vector_size(x)))は、型をサイズxのベクトルとして扱うようにGCCに指示します。 SSEの場合、これは16バイトです。

ただし、さまざまな<*mmintrin.h>ヘッダーにある__m128、__m128i、または__m128dタイプを使用することをお勧めします。それらはコンパイラ間でより移植性があります。

+0

また、読みにくい方法です。 – LtWorf

+0

この組み込み関数は、MSVCにのみ移植性があります。ベクトル拡張は、GCC、Clang、およびICCで機能します。彼らはまた、ハードウェアに依存しません。これは、例えばARMでも同様に使用できることを意味します。あなたは、私がGCCとClangに対してx86とARMの両方で提訴したベクトル拡張の力を[ここ](https://stackoverflow.com/a/48283672/2542702)で見ることができます。 ICCのためにそれらを拡張するのは簡単でしょうが、私の答えは長くなりました。 –

関連する問題