2017-09-09 6 views
5

我々はいくつかの場所でベクトルを入れ替え、そして我々はvec_permビルトインで使用するために区別さ0値を必要としています。私たちは、vec_zero()または類似の位置を特定することができていないので、我々は我々が物事を処理する方法を知っていただきたいと思います。VSX値をゼロにする方法は?

コードは、現在、2つの戦略を使用します。最初の戦略は、ベクトルロードです:

__attribute__((aligned(16))) 
static const uint8_t z[16] = 
    { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }; 

const uint8x16_p8 zero = vec_ld(0, z); 

第二の戦略は、我々が使用するマスクを使用してXORである:

__attribute__((aligned(16))) 
static const uint8_t m[16] = 
    { 15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0 }; 

const uint8x16_p8 mask = vec_ld(0, m); 
const uint8x16_p8 zero = vec_xor(mask, mask); 

我々は(まだ)ベンチマークを開始していないので、私たちはしないでくださいいずれかが他より優れているかどうかを知る。最初の戦略はVMX負荷を使用し、高価になる可能性があります。第2の戦略は負荷を回避するが、データ依存性を導入する。

どのように我々はゼロのVSX値を取得するのですか?

+0

:私のマシン上で

vector char foo(void) { const vector char zero = {0}; return zero; } 

、これはにコンパイルされます。たとえば、簡単なテスト

これはあなたが使用しているコンパイラに応じて、この2つの異なる構文は、)コンパイラは、一般的にベクトルにゼロをスプラットする方が効率的である方の方法を選択します。 –

+0

もちろん、0やその他の小さな値に対しては、vec_splatの直接形式を使用することもできます。 –

答えて

1

私は、コンパイラはあなたのためにそれを処理できるようにすることをお勧めしたいです。ただ、ゼロに初期化:

const uint8x16_p8 zero = {0}; 

- そうxorにコンパイルされます。あなただけがあることを通常の方法(ノートでゼロにベクトル変数を初期化した場合

0000000000000000 <foo>: 
    0: d7 14 42 f0  xxlxor vs34,vs34,vs34 
    4: 20 00 80 4e  blr 
    ... 
関連する問題