質問

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

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

役に立ちましたか?

解決

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

プラグマ/組み込みアプローチを使用して、アセンブリを確認します。コンパイラが不正なコードを生成する場合(SSEレジストをスタックに流出させる、または冗長な移動を追加するなど)、ループボディ全体にインラインアセンブラを使用します。

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

他のヒント

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

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

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

私は、害よりも良い自動ベクトライザーをまだ見ていません。

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