1

OSX のAccelerate フレームワークを使用すると、ベクトル float、ベクトル int、およびベクトル bool を操作できる 4 方向の SIMD 機能にアクセスできます。それはあなたに4方向の除算、例えば4方向のsin、cos、tanなどを提供します.

4 つの float の vector float の場合、フレームワークはvFloatを提供します。4 つの bool のベクトル bool の場合、フレームワークはvBool32を提供します。

私が達成しようとしているのは、このコード行の 4-way SIMD バージョンです。

  float a = ...;
  float b = ...;
  bool  condition = ...;

  float selected = condition ? a : b;

たとえば、Cell プロセッサでは、組み込みの 'spu_sel(val1, val2, conditional)' を使用します。

4方向の選択を次のように書き留めてみました。

vFloat a = { ... };
vFloat b = { ... };
vBool32 condition = { ... };

vFloat selected = condition ? a : b;

...これは '?' として LLVM コンパイラによって受け入れられません。operator は vBool32 を受け入れません。また、上記の Web ページには、「vsel」または「vself」などと呼ばれる演算子はありません。このフレームワークで使用可能な浮動小数点選択はありますか? もしそうなら、どのようにアクセスするのですか?

4

1 に答える 1

2

このレベルの抽象化で作業したい場合は、目的の結果を得るために、おそらく 1.0f または 0.0f を乗算する必要があります。これは、AltiVec と SSE の両方がクロック サイクルごとに少なくとも 1 つの SIMD 浮動小数点乗算を発行できるため、実際には依然として非常に効率的です。

ただし、パフォーマンスの最後のビットをすべて取得したい場合は、ネイティブ SIMD プログラミングにドロップダウンして、関連する組み込み関数を使用する必要があると思います ( vec_selAltiVecの場合、_mm_blend_psSSE4 の場合、//_mm_and_ps古いものの場合) SSE 実装)。_mm_andnot_ps_mm_or_ps

于 2011-08-25T08:04:06.723 に答える