問題タブ [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.
gcc - GCC ベクトル化プラグマ
インテル コンパイラを使用すると、ユーザーが を使用して依存関係がないことを確認した場合でも、ループをベクトル化できます#pragma ivdep
。
GCC#pragma GCC ivdep
で見つけましたが、次のようなエラーが発生しました。
warning: ignoring #pragma GCC ivdep [-Wunknown-pragmas]
#pragma GCC ivdep
qt - メモリ整列 QVector().data()
私は Qt5 を使用してプログラムを書いていますQVector <float>
が、data()
ポインタを 32 バイトに揃えて を割り当てる必要があります。
Qtライブラリ自体を変更せずにこれを行うことができる方法はありますか?
私のコードは次のようになります。
Intel の C++ コンパイラを使用しています。
c - ループを展開し、ベクトル化を使用して独立した合計を実行します
次のループでは、連想演算を使用するように指示した場合にのみ、GCC はループをベクトル化します-Ofast
。
これがアセンブリです-Ofast -mavx
これは、ループがベクトル化されたことを明確に示しています。
しかし、このループには依存関係の連鎖もあります。加算のレイテンシーを克服するために、x86_64 で少なくとも 3 回アンロールして部分合計を実行する必要があります (8 回アンロールする必要がある Skylake と、Haswell と Broadwell で 10 回アンロールする必要がある FMA 命令で加算を行うことを除く)。 . 私が理解している限り、でループを展開できます-funroll-loops
。
との組み立てはこちら-Ofast -mavx -funroll-loops
。
GCC はループを 8 回アンロールします。ただし、独立した合計は行いません。従属合計を 8 つ計算します。それは無意味であり、展開しないのと同じです。
GCC にループを展開させ、独立した部分和を実行させるにはどうすればよいですか?
編集:
Clang は-funroll-loops
、SSE がなくても 4 つの独立した部分和に展開されますが、その AVX コードがそれほど効率的かどうかはわかりません。-funroll-loops
とにかくコンパイラはwithを必要としないはずな-Ofast
ので、少なくとも SSE では Clang がこれを正しく行っていることを確認するのは良いことです。
Clang 3.5.1 with -Ofast
.
ICC 13.0.1 と-O3
2 つの独立した部分合計への展開。ICC はどうやら のみの連想演算を前提としてい-O3
ます。
visual-c++ - コンパイラが SSE または AVX に効率的にコンパイルできる C++ コードを作成する方法は?
多くのベクトルで行列ベクトル乗算を実行する C++ で記述された関数があるとします。変換するベクトルの配列へのポインターを取ります。コンパイル時に渡されたポインターのアラインメント (SSE の場合は 16 バイトのアラインメント、AVX の場合は 32 バイトのアラインメントが必要) をコンパイラが認識しないため、コンパイラはそれを SIMD 命令に効率的に最適化できないと仮定するのは正しいですか? それとも、データのメモリ アライメントは最適な SIMD コードには関係なく、データ アライメントはキャッシュ パフォーマンスにのみ影響しますか?
生成されたコードでアラインメントが重要な場合、特定のアラインメントを持つ値のみを関数に渡すつもりであることを (Visual C++) コンパイラにどのように知らせることができますか?
gcc - GNU の -ftree-vectorize オプション
GCC コンパイラでは、この-ftree-vectorize
オプションは自動ベクトル化をオンにし、このフラグは を使用すると自動的に設定され-O3
ます。どのレベルまでベクトル化しますか? つまり、SSE2、SSE4.2、AVX、または AVX2 命令を取得できますか? mavx
、フラグなどの存在はmavx2
知っていますが、特定のタイプのベクトル化を強制するために、これらの特定のフラグなしでコンパイラーが何をしているのかを知りたいです。
optimization - SSE は冗長ですか、それとも推奨されませんか?
こことインターネットを見回すと、多くの実際の状況で最新のコンパイラが SSE を打ち負かしているという多くの投稿を見つけることができます.2006 年に整数ベースの画像処理のために書かれた SSE コードを無効にしたときに継承したコードに遭遇しました。コードを標準の C ブランチに強制すると、より高速に実行されます。
複数のコアと高度なパイプラインなどを備えた最新のプロセッサでは、古い SSE コードはパフォーマンスが低下しgcc -O2
ますか?
c++ - モジュロインデックスによる自動ベクトル化?
私は、次のような単純なビットスクランブリングループをclang ++自動ベクトル化しようとしています:
とが同じ長さの場合dst
、コンパイラはこのループをベクトル化しても問題ありませんが、私が本当にやりたいことは次のとおりです。src
key
キーをデータほど長くする必要はありませんが% 64
、ベクトライザーを追加すると、通常のループが発生します。これ% 8
は、SIMD レジスタのサイズであっても発生します。私が次に試したのはこれでした:
しかし、ベクトライザーはこれも気に入りませんでした。
ただし、これを行う:
正常にベクトル化されましたが、キーが 1 バイトしかないのは、私が望んでいたよりも短くなっています。
ベクトライザーを喜ばせる方法でこのようなことを行う方法はありますか?