2016-12-19 23 views
-1

私は一度に3つの非対称整数値の3つの対称セットで動作するいくつかのコードを持っています。かなりの量の条件コードと多くの定数があります。SIMDの方が速い場合の経験則は何ですか? (SSE2、AVX)

これはperfボトルネックになっており、64ビットIntel/AMD CPU上のSIMDでパフォーマンスが向上すると、私はいくつかのルールを探しています。コードはかなり長く、前にSSE2やAVXを使用したことがないので、時間を投資する前にperfの勝利が可能かどうかを知ることは良いことです。

親指のルールをリストしたり、既存のホワイトペーパーを指しているのであれば、それを感謝します。

+0

チュートリアル/イントロについてはhttp://stackoverflow.com/tags/sse/infoも参照してください。 –

+2

あなたのコードをプロファイリングし、最も重要なセクションを特定し、これらをSIMD最適化の可能性についての議論のためにここに掲示できるもの(理想的には[mcve])に凝縮したいと思うかもしれません。 –

答えて

1

タグのwikiには(単一SIMDベクトルへ[x,y,z,w]幾何ベクトルを置くようにし、古典的な落とし穴)ベクトル化を可能にするために、あなたのデータ構造を変換するいくつかの素晴らしい例を持っている自分自身で理解しやすいですthese slides from a talk含めて、ベクトル化へのカップルのガイドを持っています。独立したオペレーションの多くは、z[i] = d * x[i] + y[i]様ループ内すなわちないシリアル依存関係が存在する場合


SIMDための古典的なユースケースです。または、ある場合は、並べ替えを可能にする連想操作のみで行います。 (例えば、配列の合計または同様の縮小)。

シャッフルを頻繁にやりなおすことができることも重要です。理想的には、連続したメモリからロードした後に、すべてのデータラインがベクトルで "垂直"になります。

通常、SIMDの場合、隣接する要素に対してさまざまな方法が適用されます。そのためには、ブランチレスの実装が必要です。したがって、すべてのブランチの両方の作業をすべてマージしなければなりません。あなたは、ベクターのすべての4(またはすべての16または任意の)要素が


同じ道を行くことを確認することができない限り、彼らは「ので、あなたはそれを期待していない場合でも、ベクトル化することができますいくつかのものがあります。通常の大雑把なルールの例外を除きます。例えばconverting an IPv4 dotted-quad string into a 32-bit IPv4 address、または小数点の文字列を整数に変換する、つまりimplementing atoi()です。これらは、PSHUFBのシャッフルマスクのルックアップテーブルと、LUTのインデックスとしてのベクトル比較ビットマップを含む複数の異なるトリックを巧みに使用してベクトル化されています。

だから、いくつかのトリックを知ったら、ほんの少数のルールに基づいてベクトル化された実装をすばやく排除します。 SIMD prefix sumsのように、時にはシリアル依存関係を回避することもできます。

+0

インテルWebセミナーがいくつかあります。 1つのストライドを持つ連続した構造体または配列内のデータ。 – Holmz

関連する問題