問題タブ [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.

0 投票する
1 に答える
389 参照

optimization - LLVM ScalarEvolution パスがループ ベクトライザーの終了カウントを計算できない

LLVM の組み込みループ ベクトライザーを実行する方法を理解しようとしています。非常に単純なループを含む小さなプログラムがあります (ある時点で出力があったため、使用されていないにもかかわらず stdio.h がまだ含まれています)。

ご覧のとおり、何も役に立ちません。for ループをベクトル化できるようにするだけです。私はそれをLLVMバイトコードにコンパイルしています

次に、ベクトライザーを適用しています

ただし、デバッグ出力には次のように表示されます。

LLVM ソースを少し掘り下げてみたところ、SCEV は ScalarEvolution パスから来ているように見えます。このパスには、(とりわけ) バック エッジの数をループ条件に戻すタスクがあり、この場合は (私が間違っていない場合) は、トリップ数から最初のトリップを引いたもの (この場合は 9,999) である必要があります。このパスをはるかに大きなベンチマークで実行したところ、すべてのループでまったく同じエラーが発生したため、ループ自体ではないと推測していますが、十分な情報を提供していません。

この変換を使用した完全な opt コマンドの例を見つけるために、ドキュメントと Google の結果をくまなく調べましたが、これまでのところ成功していません。何が欠けているかについてのヒントをいただければ幸いです (コードをベクトル化するのは初めてなので、非常に明白なものになる可能性があります)。

ありがとうございました、

スティーブン

0 投票する
1 に答える
1131 参照

gcc - gcc 自動ベクトル化 (未処理のデータ参照)

そのようなコードが gcc 4.4.6 でベクトル化されない理由がわかりません

ただし、次のコードを書くと

gcc はこのループの自動ベクトル化に成功します

omp ディレクティブを追加すると

ベクトル化されていない次のエラーがあります: unhandled data-ref

最初のコードと 3 番目のコードが自動ベクトル化されない理由を教えてください。

2 番目の質問: 数学オペランドがベクトル化されていないようです (exp、log など)。このコードは、たとえば

ベクトル化されていません。私のバージョンの gcc が原因ですか?

編集: gcc 4.8.1 および openMP 2011 の新しいバージョン (echo |cpp -fopenmp -dM |grep -i open) では、基本的にすべての種類のループに対して次のエラーが発生します。

編集2:

との結果

たくさんの

ありがとう

0 投票する
0 に答える
92 参照

c - Visual 2012 を使用した max 関数の自動ベクトル化

現在、uint_32 値の大きな配列に対して単純な「最大関数」ループ スキャンを実行しようとしています。

AVX2組み込みを使用すると、かなり簡単です:

唯一の重要な操作は、要求された作業を効率的に実行する _mm256_max_epu32 (vpmaxud) です。テーブル内のすべてのセルが単一の定数と比較されます。

さて、組み込みの使用は、移植性の点で少し制限的であり、コンパイラーが自動的にベクトル化する標準 C を使用して同等のバージョンを作成することをお勧めします。結局のところ、内側のループは安価なヒューリスティックで見つけられるほど単純に見えます。

残念ながら、自動ベクトル化に関する VS2012 のメモには、この関数を正しく検出する必要があると明確に記載されていますが、この単純な演習に失敗しています。

http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-04-99/3007.Auto_2D00_Vectorizer_2D00_08_2D00_Cookbook.pdf

私が試したこと:

動作しません: クックブック ステートメントとは対照的に、ここでは "if" ステートメントが問題です: 自動ベクトル化はコード 1100 で失敗します

別の理由ではありますが、自動ベクトル化はコード 1304 で失敗します(ループには異なるサイズの代入が含まれます)。これは、すべての変数が同じ型を使用しているため、バグである可能性があります。

これは機能し、ベクトル化されています。しかし、それはより複雑であり、実行は直接組み込みバージョンよりも著しく遅くなります。

この単純な「最大」操作を Visual (GCC と Clang に従う) によって自動的にベクトル化する方法があるかどうか疑問に思っています。

0 投票する
0 に答える
1363 参照

c++ - GCC による自動ベクトル化

コードで行列ベクトル積をベクトル化したいと考えています。GCC で自動ベクトル化を使用しようとしましたが、まったく機能せず、どうすればうまくいくかわかりません。今、私は非常に単純なサンプルコードを試しています:

私はgccバージョン4.9.2を使用し、フラグを付けてコンパイルします(完全を期すため)

次の出力が得られます (意味がよくわかりませんが、ベクトル化がうまくいかないことは明らかです)。

私は他にも多くのことや他のコードを試しましたが、何もベクトル化できませんでした。トリックは何ですか?

0 投票する
1 に答える
550 参照

c++ - ほぼ同じコードに対してベクトル化の動作が異なるのはなぜですか?

同じことを行う無料の関数を次に示しますが、最初のケースではループはベクトル化されませんが、他のケースではベクトル化されます。何故ですか?

コンパイラからの関連メッセージ (VS2013):

@tony のコメントより

理由 1200: 「ループには、ベクトル化を妨げるループ搬送データ依存が含まれています。ループの異なる反復が互いに干渉し、ループをベクトル化すると間違った結果が生成され、自動ベクトライザーはそのようなデータ依存がないことを証明できません。 ." ソース