問題タブ [auto-vectorization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - std::vector で Visual Studio 2012 Express の自動ベクトル化が行われない
私は3つの std::vector を持ち、それらをforループで使用している単純なプログラムを持っています。コンパイル フラグを有効にした後、これらのループが最適化されているかどうかをテストしています。しかし、ビジュアル スタジオは、理由 1200 によりループがベクトル化されていないことを示しています。私のサンプル コードは次のとおりです。
以下は、オプション「/Qvec-report:2」を有効にしてこのコードをコンパイルした結果です。
2> --- 関数の解析: main 2> d:\test\ssetestonvectors\main.cpp(12) : 情報 C5002: 理由 '1200' によりループがベクトル化されていません 2> d:\test\ssetestonvectors\main.cpp( 18) : 情報 C5002: ループは理由 '1200' によりベクトル化されませんでした
msdn ページでエラー コード 1200 について読んだとき: https://msdn.microsoft.com/en-us/library/jj658585.aspx エラー コード 1200 は、「ループにループを含むデータ依存が含まれている」ことが原因であると指定されています。
このループにそれがどのように含まれているのか理解できません。SSE2用に最適化できるように、Visual Studioの自動ベクトル化機能を使用できるように、最適化する必要があるある種のコードがあります。このコードにはベクトル演算が含まれています。ビジュアルスタジオがこのようなエラーコードを表示するたびに、私はそれを行うことができません.
c++ - Clang または GCC は、手動で展開されたループを自動ベクトル化できますか?
私は、特定の種類の数値アルゴリズムを記述するためのコード スタイルのアイデアを持っています。このコード スタイルでは、データ レイアウトにとらわれない方法でアルゴリズムを純粋に記述します。
つまり、すべての関数は (1 つまたは複数の) スカラー引数を取り、(ポインターを介して) 1 つまたは複数のスカラー戻り値を返します。したがって、たとえば、3 つのメンバーを持つ構造体または float[3] xyz を使用する代わりに、3d float ベクトルを使用する関数がある場合、float x、float y、float z を使用します。
アイデアは、入力データと出力データのレイアウトを変更できるということです。つまり、配列の構造体と構造体データの配列の配列、キャッシュ効率のためのタイルレイアウト、SIMD とマルチコアの粒度などで遊ぶことができます...データ レイアウトのすべての組み合わせについて、すべてのコードを書き直す必要があります。
この戦略にはいくつかの明らかな欠点があります。
- 関数内で for ループを使用してコードをよりコンパクトにすることはできません
- 関数のシグネチャには、より多くのパラメーターが必要です
...しかし、配列が短い場合、それらは口当たりが良く、高速にするためにコードを何度も書き直す必要がなくなります。
しかし特に、コンパイラが x+=a; のようなものを扱えないのではないかと心配しています。y+=b; z+=c; インライン化された関数のスタックの一番上で SIMD を実行するのではなく、呼び出しスタックの一番下で SIMD を実行したい場合は、w+=d を使用して単一の SIMD ベクトル add に自動ベクトル化します。
clang および/または gcc は、C および/または C++ コードで (おそらく関数がインライン化された後) 手動でアンロールされたループを「再ロール」し、ベクトル化されたマシン コードを生成できますか?
c++ - 整列された std::array からの最初の自動ベクトル化ロードがスカラーであるのはなぜですか? (g++/clang++)
std::array<uint64_t,...>からデータを読み取るときに、コンパイラが初期ベクトルロードを使用できない理由を理解するのに問題があります。
gcc が -fopt-info-vec-* でデバッグ情報を生成できることは知っています。詳細なログから、両方のコンパイラが最初のスカラーロードを使用するために最適ではない同じ決定を下す理由を示すものは何も見つかりません。
一方、ベクトル化の問題に関する詳細な情報を提供するために clang を作成する方法がわかりません。-Rpass-analysis=loop-vectorize は、init のループがインターリーブする価値がないことのみを報告します。もちろん、私の組み込みバージョンは、ループをベクトル化できることを証明していますが、必要な変換はおそらく複雑すぎて、コンパイラから除外することはできません。
もちろん、組み込み関数を使用してホット パスを実装することもできますが、そのためには各 CPU アーキテクチャに同じロジックを複製する必要があります。私は、コンパイラーがほぼ完全にベクトル化できる標準的な C++ コードを作成することを好みます。target_clones 属性またはマクロと target 属性を使用して、異なるフラグで同じコードを複数回コンパイルすることが簡単になります。
ロードがベクトル化に失敗した理由をコンパイラに伝えるにはどうすればよいですか?
gcc はすでにその情報を出力しているのではないかと思いますが、何を探しているのかわからないだけです。
自動ベクトル化が初期ロードで失敗するのはなぜですか?