問題タブ [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.
c++ - gcc の最適化により、より遅いコードが生成される
gcc 4.8.2 を使用して次のコードをコンパイルしようとしています。コンパイルするとg++ -mavx2 -O0 10bit.cpp
、time コマンドから次の出力が得られます。
実質 0m0.117s
ユーザー 0分0.116秒
システム 0m0.000s
しかし、最適化を有効にするg++ -mavx2 -O3 10bit.cpp
と、time コマンドの出力に実行時間が長くなります。
実質 0m0.164s
ユーザー 0分0.164秒
システム 0m0.000s
私のCPUモデル名は次のとおりです。Intel(R) Xeon(R) CPU E5-2667 v3 @ 3.20GHz
これはAVX2
サポートされています。また、SSE4.1
の代わりに命令を実行するとAVX2
、プログラムははるかに速く完了します。誰かがこれを説明できますか?
intel - Intel Haswell XEON CPU が散発的に FFT と ART を誤って計算するのはなぜですか?
ここ数日、新しいワークステーションの動作を観察しましたが、説明できませんでした。この問題について調査した結果、現在の Skylake 世代だけでなく、 INTEL Haswell アーキテクチャにもバグがある可能性があります。
考えられるバグについて書く前に、使用されているハードウェア、プログラム コード、および問題自体の概要を説明します。
ワークステーションのハードウェア仕様
- INTEL Xeon E5-2680 V3 2500MHz 30M キャッシュ 12Core
- スーパーマイクロ SC745 BTQ -R1K28B-SQ
- 4 x 32GB ECC 登録済み DDR4-2133 RAM
- インテル SSD 730 シリーズ 480 GB
- NVIDIA テスラ C2075
- NVIDIA タイタン
問題のオペレーティング システムとプログラム コード
現在、Ubuntu 15.04 64 ビット デスクトップ バージョンを実行しており、最新のアップデートとカーネルがインストールされています。このマシンを使用して CUDA カーネルなどを開発する以外に、最近純粋な C プログラムをテストしました。このプログラムは、非常に大きな入力データセットに対して一種の修正されたARTを実行しています。そのため、コードはいくつかの FFT を実行し、計算を完了するのにかなりの時間を費やします。これは公開できない進行中の研究であるため、現在、ソースコードを投稿/リンクすることはできません. ARTに慣れていない場合、それが何をするかを簡単に説明します。ART は、コンピューター断層撮影装置から受信したデータを再構成して、診断用の可視画像を取得するために使用される技術です。したがって、私たちのバージョンのコードは、2048x2048x512 のようなサイズのデータ セットを再構築します。これまでのところ、特別なこともロケット科学も関係ありませんでした。数時間のデバッグとエラーの修正の後、コードは参照結果でテストされ、コードが想定どおりに機能することを確認できます。コードが使用している唯一のライブラリは standardmath.h
です。特別なコンパイル パラメータはなく、追加の問題を引き起こす可能性のある追加のライブラリもありません。
問題の観察
このコードは、データの再構築に必要な投影を最小限に抑える手法を使用して ART を実装します。では、25 の投影を含む 1 つのデータ スライスを再構築できると仮定しましょう。コードは、12 個のコアでまったく同じ入力データで開始されます。実装はマルチスレッドに基づいていないことに注意してください。現在、プログラムの 12 のインスタンスが起動されています。私はこれが最善の方法ではないことを知っています.適切なスレッド管理を含むことが強く推奨されており、これはすでに改善のリストに含まれています:)
したがって、プログラムの少なくとも 2 つのインスタンスを実行すると (すべてのインスタンスが個別のデータ スライスで動作します)、結果はいくつかの予測がランダムに間違っています。結果の概要については、表 1 を参照してください。入力データは常に同じであることに注意してください。
CPU の 1 つのコアを含むコードのインスタンスを 1 つだけ実行すると、結果はすべて正しくなります。1 つの CPU コアを使用していくつかの実行を実行しても、結果は正しいままです。表 1 に示すように、少なくとも 2 つ以上のコアを含む場合にのみ、結果パターンが生成されます。
問題の特定
さて、実際に何が問題なのかを理解するのにかなりの時間がかかりました。そのため、コード全体を調べましたが、これらの問題のほとんどは小さな実装ミスから始まります。しかし、まあ、いいえ (もちろん、バグがないことを証明したり、保証したりすることはできません)。コードを検証するために、2 つの異なるマシンを使用しました。
- (Machine1) Intel Core i5 Quad-Core (2009年後半以降のモデル)
- (マシン 2) Intel XEON 6core SandyBridge CPU で実行される仮想マシン
驚くべきことに、Machine1 と Machine2 の両方が常に正しい結果を生成します。すべての CPU コアを使用しても、結果は正しいままです。すべてのマシンで 50 回以上の実行が行われるという 1 つの間違った結果もありません。コードは、最適化オプションや特定のコンパイラ設定なしで、すべてのターゲット マシンでコンパイルされました。そのため、ニュースを読んだ結果、次のような結果が得られました。
- ArsTechnika - 複雑なワークロード中に Skylake CPU がフリーズする
- PcWorld - skylake バグについて PC をテストする方法
- インテル コミュニティ - Skylake プロセッサをフリーズするための簡単な手順
したがって、Prime95とMersenne Communityの人々は、この厄介なバグ を最初に発見して特定したようです。参照された投稿とニュースは、問題が重いワークロードの下でのみ存在するという疑いを裏付けています。私の観察に従って、この動作を確認できます。
質問)
- あなた/コミュニティは、Haswell CPU と Skylake CPU でこの問題を観察しましたか?
- gcc がデフォルトの AVX(2) 最適化 (可能な限り) ごとに行うように、この最適化をオフにすると役立ちますか?
- コードをコンパイルして、このバグの影響を受ける可能性のある最適化がオフになっていることを確認するにはどうすればよいですか? これまでのところ、Haswell / Skylake アーキテクチャで設定された AVX2 コマンドを使用する際の問題についてのみ読んでいます。
ソリューション?
AVX2 の最適化をすべてオフにできます。しかし、これは私のコードを遅くします。Intel は、Intel CPU のマイクロコードを変更する BIOS アップデートをメインボード メーカーにリリースする可能性があります。ハードウェアのバグのようですので、CPU のマイクロコードを更新することによっても、これは興味深いものになるかもしれません。Intel CPU は、マイクロコードによって制御される RISC から CISC への変換メカニズムを使用するため、これは有効なオプションであると思います。
編集: Techreport.com - Errata は Intel に Haswell で TSX を無効にするように促します。初期の Broadwell CPUは CPUのマイクロコード バージョンをチェックします。
EDIT2: 現在 (19.01.2016 15:39 CET) Memtest86+ v4.20 が実行され、メモリをテストしています。これが完了するまでにはかなりの時間がかかるように思われるため、明日の投稿で結果を更新します。
EDIT3: 現在 (21.01.2016 09:35 CET) Memtest86+ は 2 回の実行を終了し、合格しました。メモリエラーは1つもありません。CPU のマイクロコードを から に更新しましrevision=0x2d
たrevision=0x36
。現在、こちらで公開するソースコードを準備中です。間違った結果の問題が成り立ちます。私は問題のコードの作成者ではないため、許可されていないコードを投稿しないように再確認する必要があります。私もワークステーションを使用し、それを維持しています。
EDIT4: (22.01.2016) (12:15 CET) ソースコードのコンパイルに使用される Makefile は次のとおりです。
そしてgcc -v
出力:
intrinsics - インテル ギャザー インストラクション
Intel が組み込み関数を収集する方法について少し混乱しています。
次の簡単なコードがあります。1 つは y[0]=y[1] = x[0], ... y[20002]=y[20003]=x[10002] を設定する方法で、もう 1 つは y[i] = を設定する方法です。 x[i]、y[i+1] = x[i+2]。
正しいかどうかを確認するために、いくつかの値をランダムに出力します。「ゼロ」を使用すると、y[10] と y[11] の両方が 2.46 になることがわかりました。ただし、y[10] は 2.46 のままですが、「stride」を使用すると y[11] の乱数が取得されます。何が悪いのか何か考えはありますか?
c - インテル FMA 命令によるパフォーマンスの利点はゼロ
Haswell の FMA 命令を使用した次の命令シーケンスを考えてみましょう。
同じ計算は、次のように非 FMA 命令を使用して表現できます。
FMA バージョンでは、非 FMA バージョンよりもパフォーマンスが向上すると予想されます。
残念ながら、この場合、パフォーマンスの向上はゼロ (0) です。
誰かが理由を理解するのを手伝ってくれますか?
コア i7-4790 ベースのマシンで両方のアプローチを測定しました。
アップデート:
そこで、生成されたマシン コードを分析したところ、Haswell には 2 つの FMA パイプがあるため、r1 と r2 の依存関係チェーンが並行してディスパッチできるように、MSFT VS2013 C++ コンパイラがマシン コードを生成していると判断しました。
r3 は r1 の後にディスパッチする必要があるため、この場合、2 番目の FMA パイプはアイドル状態になります。
ループを展開して 3 セットではなく 6 セットの FMA を実行すれば、反復ごとにすべての FMA パイプをビジー状態に保つことができると考えました。
残念ながら、この場合のアセンブリ ダンプを確認したところ、MSFT コンパイラは、探していた種類の並列ディスパッチを許可するレジスタ割り当てを選択していませんでした。また、求めていたパフォーマンスの向上が得られなかったことが確認されました。為に。
C コードを (組み込み関数を使用して) 変更して、コンパイラがより良いコードを生成できるようにする方法はありますか?
c# - AVX のみを搭載したプロセッサが、多くの SIMD アルゴリズムで AVX2 プロセッサよりも優れているのはなぜですか?
私は C# と C++ で SIMD アルゴリズムの利点を調査してきましたが、多くの場合、AVX プロセッサで 128 ビット レジスタを使用すると、AVX2 を搭載したプロセッサで 256 ビット レジスタを使用するよりも優れた改善が得られることがわかりました。理由がわかりません。
改善とは、同じマシン上の非 SIMD アルゴリズムに比べて SIMD アルゴリズムの速度が向上したことを意味します。
visual-studio-2015 - MSVC 2015 AVX2 のデバッグの問題。すべての SIMD レーンが正しく実装されているわけではありません
Visual Studio 2015 update 1 (Win10 を対象) で AVX2 コードのデバッグに問題があります。
デバッガーを使用して AVX2 レジスターを検査する場合、ブレークポイントを使用して _mm256_insertf128_ps-intrinsic をステップ オーバーする場合 (たとえば) は、通常のプログラムの実行と比較して内容が異なります。バグは簡単に再現できます。main 関数に次のコードを記述して、新しい Win コンソール アプリケーションを作成するだけです。
行 4 にブレークポイントを設定し、それをステップオーバーすると、行 5 ~ 6 の印刷ループから次の出力が発生します。
プログラムを実行すると、次の出力が得られます。
MSVC と Intel コンパイラ (バージョン 16) の両方を使用してこれを試しましたが、どちらも同じ動作を示します。
他の誰かがこの問題に遭遇しましたか? これの原因が何であるか知っている人はいますか?回避策はありますか?
前もって感謝します!
c - AVX2 __m256i const* ロード命令と AVX の mem_addr
以前に AVX で行ったように、AVX2 組み込み命令を使用してロードまたはストアすることはできません。エラーはなく警告のみで、実行時にロード/ストア命令を実行しません。他の AVX2 命令は正常に動作しますが、メモリからロードできません。
次のように。
AVX:
AVX2:
それで、問題/違いは何ですか?アイデアや解決策はありますか?