問題タブ [avx2]

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 投票する
0 に答える
105 参照

x86 - VEXTRACTF128 と VEXTRACTI128 の比較

私が知る限り、VEXTRACTF128 と VEXTRACTI128 命令は同じことを行い、同じ待ち時間、同じスループットを持ち、同じポートを使用します。それらの間の唯一の違いは、VEXTRACTF128 は AVX のみを必要とし、VEXTRACTI128 は AVX2 を必要とすることです。 それが唯一の効果的な違いである場合、なぜ VEXTRACTI128 を使用するのでしょうか?

Agner Fog の vectroclass で次のことを確認しましたが、これは、命令間に重要な違いがあることを意味すると推測しています。異なるドメイン (浮動小数点または整数) を共有している可能性がありますか?

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

performance - レジスタをスタックにエクスポートすると、パフォーマンスにどのような影響がありますか?

x86 で 32 ビット モードで実行することを意図したコードに取り組んでいます。そのモードでは、自由に操作できる SIMD/AVX2 レジスタ (YMM0-7) が 8 つしかないことを理解しています。ただし、私のベクトル サブルーチンの一部だけでも、その量を超えるレジスタを同時に使用する場合があります (つまり、それらは将来どこかでまだ必要とされますが、ほとんどは後で必要になるわけではありません)。

私の理解では、未使用のレジスタが見つからない場合、コンパイラは古いレジスタをスタック メモリにエクスポートします。しかし、これはパフォーマンスにどの程度影響しますか? (例: 後でエクスポート/インポートするサイクル)。ほとんどが L1-D-Cache に存在するスタック メモリ (Haswell では 2 サイクルのレイテンシ) を信頼できますか? または、そのようなレジスタからメモリへの (およびその逆の) 転送を回避すると、パフォーマンスに大きな影響がありますか?

これまでのところ、このトピックに対する答えを見つけることができませんでした。特に、レジスターがどんどん大きくなり続けているためです (今後の Skylake プラットフォームでは、レジスターごとに 1 つのキャッシュライン)。回答する場合は、ソースを提供していただければ幸いです。

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

c - オペレーティング システムが avx2 命令をサポートしていることを確認する方法

Intel(R) Core(TM) i7-4702MQ CPU (Haswell アーキテクチャ)、Windows 8、Intel C++ Compiller XE 13.0 という構成があります。avx2 最適化を使用してプログラムを実行し、コンパイル フラグを設定します。

/QaxCORE-AVX2、/QxCORE-AVX2

しかし、プログラムを実行するとエラーが発生します:

致命的なエラー: このプログラムは、お使いのシステムで実行するように構築されていません。オペレーティング システムとプロセッサの両方が Intel(R) AVX2、BMI、LZCNT、HLE、RTM、および FMA 命令をサポートしていることを確認してください。

ページにある avx2 cpu サポート テストを実行します: How to detect new instruction support in the 4th generation Intel Core processor family . 結果:

この CPU は、Haswell で導入された ISA 拡張機能をサポートしています。

オペレーティング システムが avx2-extensions をサポートしていることを確認するにはどうすればよいですか? また、エラーの原因は何ですか? avx2 拡張機能を使用するには、フラグ/QaxCORE-AVX2/QxCORE-AVX2フラグの両方を設定する必要がありますか?

upd : フラグを設定した場合

そのプログラムは正常に開始されました。

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

c++ - g++ -O2 は SIMD 変数の割り当てを誤って最適化します

Intel AVX2 命令を使用してプログラムを作成しています。最適化レベル -O2 以上 (-O1 では問題ありません) でのみ現れるバグをプログラムに見つけました。大規模なデバッグを行った後、バグのある領域を絞り込みます。現在、このバグは、コンパイラが__m256i変数の単純なコピー割り当てを不適切に最適化しているために発生しているようです。

次のコード スニペットを検討してください。Foo はテンプレート化された関数です。でテストしCMP = kLess, OPT=kSetます。オプティマイザーがおそらくスイッチを最適化することは承知しています。変数を最適化することさえありますy

バギーラインはy = m_lt;. -O2 でコンパイルすると、この行は無視されるようです。その後y、正しい値が得られず、プログラムは間違った結果を生成します。ただし、プログラムは -O1 で正しいです。

私の判断を確認するためにy = m_lt;、2 つの代替案に置き換えます。

y = avx_or(m_lt, avx_zero());m_ltとすべて 0 のベクトルのビットごとの OR を取ります

y = _mm256_load_si256(&m_lt);SIMD ロード命令を使用して、 のアドレスからデータをロードしますm_lt

y = m_lt;私の意図は、いくつかの関数を追加することによって、いくつかの最適化を防ぐことです。プログラムは、すべての最適化レベルでこれら 2 つの置換を使用して正しく動作します。だから問題は奇妙です。私の知る限り、SIMD 変数の直接代入は間違いなく問題ありません (以前はよく使用していました)。コンパイラ関連の問題でしょうか?

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

avx - -xhost オプションを使用した intel icpc のコンパイル: AVX は有効化されていますか?

通常 g++ でコンパイルされたコードの速度向上を確認するために、icpc コンパイラを使用しています。

私がコンパイルするプロセッサは Intel の Sandy Bridge アーキテクチャに属しているため、AVX ベクトル化を使用したいと考えています。

icpc の「-xhost」フラグを使用すると、AVX のベクトル化を自動的に利用できるようになると誰かが言っていましたが、これは本当ですか?

そうでない場合は、フラグを icpc で設定して AVX をアクティブにするように指示していただけますか。

最後の質問: AVX2 も利用できますか? はいの場合、どのように?

ありがとう

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

macos - AVX サポートに関する mac osx 10.8.5、gcc4.9 コンパイルの問題

私のシステムは mac osx 10.8.5 です。このマシンのデフォルトの gcc は 4.2 (i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Apple Inc. ビルド 5658 に基づく) (LLVM ビルド 2335.15.00)) です。/ に gcc 4.9 をインストールしました。ユーザー/ローカル。

AVX2 組み込み関数を使用するコードがあります。メッセージ付きのコードを添付しました。

このコードを gcc 4.9 でコンパイルすると、

gcc-4.9 -O3 -march=core-avx2 a7.c, 次のエラー メッセージが表示されます。

gcc-4.9 を使用する場合、アセンブラを更新する必要があるのでしょうか? それとも、他の問題のように思えますか...ポインタが役立ちます..

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

c++ - MSVC の自動ベクトル化で AVX2 が使用されないのはなぜですか?

コンパイラ (Microsoft Visual Studio 2013) でベクトル化を使用しようとしています。私が直面している問題の 1 つは、AVX2 を使用したくないということです。この問題を調査している間、私は次の例を作成しました。これは、それぞれが 16 ビットの 16 個の数値の合計を計算します。

コンパイラーはこのコードをベクトル化しますが、SSE 命令に対してのみです。

コンパイラに AVX2 コードを生成するオプションがあることを確認するために、同じ計算を次のように記述しました。

コードの 2 つの部分が同等であることがわかります (つまり、実行後output11は同等output2です)。

そして、コードの 2 番目の部分の AVX2 命令を出力します。

ただし、組み込み関数を使用するようにコードを書き直したくはありません。ループとして記述した方がはるかに自然で、古い (SSE のみの) プロセッサと互換性があり、その他の利点もあります。

では、例を微調整して、コンパイラが AVX2 の方法でベクトル化できるようにするにはどうすればよいでしょうか?