13

SSEレジスターにパックされた4つのフロートすべてのサインを反転させる最も効率的な方法を探しています。

Intelアーキテクチャソフトウェア開発マニュアルでこれを行うための本質を見つけていません。以下は私がすでに試したことです。

いずれの場合も、コードを100億回ループして、実時間を示しました。単項マイナス演算子のみを使用する非SIMDアプローチでは、少なくとも4秒を一致させようとしています。


[48秒]
_mm_sub_ps( _mm_setzero_ps(), vec );


[32秒]
_mm_mul_ps( _mm_set1_ps( -1.0f ), vec );


[9秒]

ユニオンNegativeMask{
    int intRep;
    float fltRep;
} negMask;
negMask.intRep = 0x80000000;

_mm_xor_ps(_mm_set1_ps(negMask.fltRep)、vec);


コンパイラは-O3を含むgcc4.2です。CPUはIntelCore2Duoです。

4

3 に答える 3

25

その結合は実際には必要ありません。何よりも優れているのは (読みやすさ、速度、および移植性):

_mm_xor_ps(vec, _mm_set1_ps(-0.f))
于 2010-08-20T07:00:52.243 に答える
3

これらの組み込みベクトルに関するgccドキュメントで独自の回答を完成させるには、次のようにします。

The types defined in this manner can be used with a subset of normal C
operations.  Currently, GCC will allow using the following operators on
these types: `+, -, *, /, unary minus, ^, |, &, ~'.

可能な場合は常にこれらに固執することをお勧めします。非常に高い可能性で、gccは常にこのSSEのものに最も効率的なコードを提供します。

コンパイラオプションについては、アーキテクチャに固有の何かを追加します-march=native。ほとんどの場合のようになります。

于 2010-07-29T14:22:16.750 に答える
2

午前3時までのコーディングに関するライフレッスン.....

パックされたベクトルで単項マイナスを使用しようとしたことはありません。これは実際にコンパイルされ、非SIMDアプローチとまったく同じパフォーマンスを発揮します。

于 2010-07-29T09:55:27.387 に答える