質問

私は x86 命令セット拡張について調べてきましたが、それらはいくつかの非常に特殊な状況でのみ役立つようです (たとえば、SSE3 の HADDPD - (horizo​​ntal-add-packed-double))。これらには、意図的に設定するか、その前の一連の命令から発生する特定のレジスタ レイアウトが必要です。gcc のような汎用コンパイラーは、これらの命令 (またはそのサブセット) を実際にどのくらいの頻度で使用しますか? それとも、主にハンドコーディングされたアセンブラーで使用されるのでしょうか?コンパイラーは SIMD 命令を使用するのが適切な場所をどのように検出しますか?

役に立ちましたか?

解決

一般に、これらを使用するコンパイラはほとんどありません。GCC と Visual Studio は通常、SIMD 命令を使用できません。SSE をコンパイラ フラグとして有効にすると、通常の浮動小数点演算にスカラー SSE 命令が使用されますが、通常はベクトル化された命令が自動的に使用されることは期待できません。最近のバージョンの GCC では場合によってはそれらを使用できる可能性がありますが、最後に試したときは機能しませんでした。Intel の C++ コンパイラは、私が知る限り、一部のループを自動ベクトル化できる唯一の大きなコンパイラです。

ただし、一般的には自分で使用する必要があります。生のアセンブラーを使用するか、コンパイラー組み込み関数を使用します。一般に、組み込みの方が、コンパイラがコードを理解し、スケジュールと最適化を容易にするため、より良いアプローチだと思います。しかし、実際には、少なくとも MSVC が常に組み込みから非常に効率的なコードを生成するとは限らないことを私は知っています。したがって、単純な asm が最良の解決策である可能性があります。実験して、何が機能するかを確認してください。ただし、1) 適切なコンパイラを使用し、2) 簡単にベクトル化できる非常に単純なループを作成する場合を除き、コンパイラがこれらの命令を使用することを期待しないでください。

2012 年のアップデート
さて、この回答を書いてから 3 年が経過しました。GCC は数年前から (単純な) コードを自動ベクトル化できるようになり、VS2012、MSVC では ついに 同じ能力を獲得します。もちろん、私の答えの主要部分は依然として当てはまります。コンパイラーは依然として、かなり単純なコードしかベクトル化できません。さらに複雑な場合は、組み込み関数またはインライン ASM をいじる必要があります。

他のヒント

モノは限り、あなたはベクトルのためにそのクラスを使用するようSIMD拡張機能を使用することができます。あなたはそれについてここに読むことができます: http://tirania.org/blog/archive/ 2008/11月-03.htmlする

GCCは、限り、あなたは-O3または特定のフラグを使用しているとして、いくつかの自動ベクトル化を行う必要があります。 http://gcc.gnu.org/projects/:彼らはここに情報ページを持っていますツリー-SSA / vectorization.htmlする

SSE およびその他の小さなベクトル ユニットをどのように活用するかという問題 自動的に (特別な言語構造または特別に恵まれたコンパイラ「組み込み」の形でプログラマからの指示なしで) は、しばらくの間コンパイラ研究のトピックでした。ほとんどの結果は、次のような特定の問題ドメインに特化しているようです。 デジタル信号処理. 。私はこのトピックに関する文献を追い続けていませんが、 持っている ベクトル (SSE) ユニットの活用は依然として研究課題であり、この分野で一般的に使用されている汎用コンパイラにはあまり期待しない方がよいと述べています。

推奨される検索語: ベクトル化コンパイラ

あなたは、ベクトルPascalコンパイラを使用する場合は、

あなたはSIMDの優位性を与えるためのタイプのための効率的なSIMDコードを取得します。基本的にこれは64ビット未満の長さのものです。 (64ビット実数のためには、SIMDを行うには、実際に遅くなります)。 コンパイラの最新バージョンも自動的にaccrossコアを並列化します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top