5

明示的なプラグマを使用して手動でコードをベクトル化するか、自動ベクトル化に依存または使用する方が、ある意味で優れていますか? 自動ベクトル化を使用して最適なパフォーマンスを得るには、コンパイラーの出力を監視して、ループがベクトル化されていることを確認するか、ベクトル化できるようになるまでループを変更する必要があります。

手作業によるコーディングでは、目的の命令が発行されていることは確かですが、コードは (他のアーキテクチャまたは他のコンパイラに) 移植できない可能性があります。

4

2 に答える 2

14

自動ベクトル化は、私にとってはうまくいきませんでした。現時点では、自動ベクトル化は非常に単純なループに対してのみ機能するようです。

プラグマ/組み込みアプローチを使用して、アセンブリを調べます。コンパイラが悪いコードを生成する場合 (SSE レジスタをスタックにこぼしたり、冗長な移動を追加したりするなど)、ループ本体全体にインライン アセンブラを使用します。

携帯性は問題ありません。多くの場合、C/C++ ループから開始し、組み込み関数を使用して最適化します。古いループを保持し、SIMD 実装の単体テスト/フォールバックとして使用してください。また、コンパイル時の定義を介してプロジェクトからすべての SIMD コードを削除できることは常に賢明です。そうすれば、アプリケーションのデバッグがはるかに簡単になります。同じ定義をクロスコンパイルに使用できます。

于 2009-01-03T18:52:34.023 に答える
5

私は、どのコンパイラーからの自動ベクトル化にも決して依存しません。の最適化の効果は常にバージョンごとに異なるため、二重にgcc警戒します。gcc特別な最適化や gcc 拡張機能に依存している私が知っているほぼ全員が、新しいgccバージョンがリリースされたときに破損に対処しなければなりません。

通常はプラグマと組み込み関数を信頼できますが、新しい gcc バージョンのリリース ノートに注意を払い、コードをコンパイルするために必要な gcc バージョンをユーザーに知らせる必要があります。

ベクトル化が本当に重要なときに 1 回か 2 回、テスト スイートに何かを追加して呼び出しobjdump、ベクトル命令が実際に使用されていることを確認しました。「悪いベクトル コード」(Nils が説明しているように) も自動的に検出できると便利ですが、そこまで到達したことはありません。

于 2009-01-03T20:01:11.280 に答える