5

次のようなコードが表示されます。

#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 拡張機能とベクトル データ型です。このコードは、4 つの単一浮動小数点数を使用して SIMD ベクトル加算を行っています。

このtypedef行の各キーワード/関数呼び出しが何を意味し、何をするのかを詳細に理解したい:

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

vector_size() 関数の戻り値は何ですか。

何の__attribute__ためのキーワードか

vfsf 型に型定義されている float データ型は次のとおりです。

残りの部分は理解しています。

ありがとう、

-広告

4

1 に答える 1

9

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

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

于 2011-01-04T18:51:32.757 に答える