2016-08-11 15 views
2

SIMD組み込み関数と何らかの形で類似しているマクロを作成しようとしています。これらのマクロを作成する理由は、SIMDをサポートしていない「Gem5」というシミュレータを使用していることです。SIMD命令に似たマクロ

さて、まず第一に、私は点状要素をフローティング4パックド単精度のベクトルを定義する構造体を作成した:

typedef struct 
    { 
    float vec1; 
    float vec2; 
    float vec3; 
    float vec4; 
    } __m128 __attribute__((aligned(16))); 

は、私はADDマクロを作成した:

#define __M128_MM_ADD_PS(dest, a,b) \ 
    {         \ 
    (dest)->vec1 = (a)->vec1 + (b)->vec1; \ 
    (dest)->vec2 = (a)->vec2 + (b)->vec2; \ 
    (dest)->vec3 = (a)->vec3 + (b)->vec3; \ 
    (dest)->vec4 = (a)->vec4 + (b)->vec4; \ 
    } 

とfloat配列に結果を格納するための別のマクロ:

#define __M128_MM_MOVA_PS(dest, a) \ 
    { \ 
    dest[0] = a->vec1; \ 
    dest[1] = a->vec2; \ 
    dest[2] = a->vec3; \ 
    dest[3] = a->vec4; \ 
    } 

としますそれら私は__m128と結果を格納するfloat配列、このよう(少し例)などの変数を宣言した:

void foo(){ 
__m128 bfly0_rv, x_n2_vec, x_N2_vec; 
float *x; 

__M128_MM_ADD_PS(bfly0_rv,x_n2_vec,x_N2_vec); 
__M128_MM_MOVA_PS(&x[n2],bfly0_rv); 
} 

と、私はエラーメッセージのこれらの種類を取得しています:

ADDマクロの場合 エラー:無効な型引数 ' - >'( '__m128') (dest) - > vec4 =(a) - > vec4 +(b) - > vec4;格納マクロ エラーの

:「 - >」の無効なタイプの引数(「__m128」を有する) DEST [3] = A-> vec4。

誰でも知っていると思いますか?

答えて

4

すべてのマクロは__m128へのポインタで機能しますが、__m128ではなく__m128 *となります。ただ、.内部のマクロを->を交換するか、&とマクロの引数を付加:

__M128_MM_ADD_PS(&bfly0_rv, &x_n2_vec, &x_N2_vec); 
__M128_MM_MOVA_PS(&x[n2], &bfly0_rv); 

__M128_MM_MOVA_PSに括弧内destaを囲むことを忘れないでください。

P.S.マクロ定義で{ ... }の代わりにdo { ... } while(0)を使用する方が良いでしょう。

+0

すべてのエラーは、Storingマクロを除いて、次のメッセージを表示します:**エラー:添え字付きの値は配列でもポインタでもベクターでもありませんdest [0] = a.vec1 **そしてdest [0 ]。 –

+0

@ A.nechi 'dest 'に中括弧を追加しましたか?それらがなければ、あなたはあなたが望むものではない '&x [n2] [0]'に展開されます。 – Sergio

+0

あなたはとても素晴らしいです:) –

関連する問題