sseタグの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のように、時にはシリアル依存関係を回避することもできます。
チュートリアル/イントロについてはhttp://stackoverflow.com/tags/sse/infoも参照してください。 –
あなたのコードをプロファイリングし、最も重要なセクションを特定し、これらをSIMD最適化の可能性についての議論のためにここに掲示できるもの(理想的には[mcve])に凝縮したいと思うかもしれません。 –