4Dベクトルで動作するコードがいくつかあり、現在SSEを使用するように変換しようとしています。私は64bLinuxでclangとgccの両方を使用しています。
ベクトルのみを操作することは、すべて問題なく把握できます。しかし、今度は、ベクトル全体に単一の定数を掛ける必要がある部分があります-次のようなものです:
float y[4];
float a1 = 25.0/216.0;
for(j=0; j<4; j++){
y[j] = a1 * x[j];
}
このようなものに:
float4 y;
float a1 = 25.0/216.0;
y = a1 * x;
どこ:
typedef double v4sf __attribute__ ((vector_size(4*sizeof(float))));
typedef union float4{
v4sf v;
float x,y,z,w;
} float4;
もちろん、これは、互換性のないデータ型の乗算を実行しようとしているため、機能しません。
今、私は次のようなことをすることができます:
float4 a1 = (v4sf){25.0/216.0, 25.0/216.0, 25.0/216.0, 25.0/216.0}
しかし、これを行うためのマクロを書いたとしても、私はばかげていると感じさせます。また、それが非常に効率的なコードにならないことはかなり確信しています。
これをグーグルで検索しても、明確な答えは得られませんでした(ロード定数がSSEレジスタにフロートするを参照)。
では、ベクトル全体に同じ定数を掛ける最良の方法は何でしょうか。