問題タブ [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.
performance - Haswell メモリ アクセス
AVX -AVX2 命令セットを試して、連続した配列でのストリーミングのパフォーマンスを確認しました。したがって、基本的なメモリの読み取りと保存を行う例を以下に示します。
そして g++-4.9 -ggdb -march=core-avx2 -std=c++11 struct_of_arrays.cpp -O3 -o struct_of_arrays でコンパイルした後
ベンチマーク サイズ 4000 では、1 サイクルあたりの命令のパフォーマンスとタイミングが非常に良好であることがわかります。しかし、ベンチマーク サイズを 5000 に増やすと、1 サイクルあたりの命令が大幅に低下し、レイテンシーが急上昇することがわかります。私の質問は、パフォーマンスの低下が L1 キャッシュに関連しているように見えることはわかりますが、なぜこれが突然起こるのか説明できません。
ベンチマーク サイズ 4000 および 5000 で perf を実行すると、さらに洞察が得られます。
私の質問は、haswell が 2* 32 バイトを読み取りに配信し、32 バイトを各サイクルに格納できる必要があることを考えると、なぜこの影響が発生しているのかということです。
編集1
このコードでは、gcc が 0 に設定されているため、myData.a へのアクセスをスマートに排除していることに気付きました。これを回避するために、a が明示的に設定されている、わずかに異なる別のベンチマークを実行しました。
2 番目の例では、1 つの配列が読み取られ、他の配列が書き込まれます。そして、これはさまざまなサイズに対して次の perf 出力を生成します。
回答で指摘されているのと同じパターンが再び見られます。データセットのサイズが大きくなると、データが L1 に収まらなくなり、L2 がボトルネックになります。また興味深いのは、プリフェッチが役に立っていないようで、L1 ミスが大幅に増加していることです。ただし、読み取りのために L1 に持ち込まれた各キャッシュ ラインが 2 回目のアクセスでヒットすることを考慮すると、少なくとも 50% のヒット率が見込めると予想されます (64 バイトのキャッシュ ラインは、各反復で 32 バイトが読み取られます)。ただし、データセットが L2 にスピルオーバーすると、L1 ヒット率は 2% に低下するようです。配列が実際には L1 キャッシュ サイズとオーバーラップしていないことを考慮すると、これはキャッシュの競合によるものではありません。したがって、この部分はまだ私には意味がありません。
assembly - ALで定義されたインデックス位置にあるバイトを抽出する方法
ymm0
問題文:値がレジスタ内にある位置にあるバイトをレジスタから抽出する必要がありますAL
。
私の方法:(かなり醜い):
これを行うためのよりエレガントな方法はありますか? アドバイスをいただければ幸いです。課題の核心は、インデックス値として(または) レジスタVPEXTRB
ではなく、即時のインデックス値のみを取ることです。CL
AL
ありがとう...
c++ - /arch:AVX は AVX2 を有効にしますか?
/arch:AVX
Visual Studio 2012 Update 4 で AVX2 (256 ビット整数 SIMD 命令といくつかの新しい FP シャッフル) を有効にしますか?
考え方:
はい、VS は AVX2 について言及していないため、AVX を有効にします。しかし、私の本質的な仕事なので、VSはAVX2を実行できると思います。
いいえ、AVX と AVX2 は別の CPU 機能
(Sandybridge と Haswell、または Excavator/Zen と Bulldozer) であるため、
SSE と SSE2 が別であるように、そうではありません。
g++ - _mm256_loadu2_m128i 組み込み関数は g++ では使用できませんか?
AVX2 組み込み関数を使用しようとしています_mm256_loadu2_m128i
が、g++ 4.8.2 にはそれがないようです。
入手する方法はありますか?
c - AVX2 レジスタからの 64 ビット値の抽出を最適化
__m256i レジスタから 64 ビットを抽出しようとしています。私の現在の抽出関数の例:
次のコードは、4x8 バイトをレジスタ位置 0 ~ 3 にシフトし、32 ビットを抽出しています。
コードは正しく動作していますが、遅いです。res1 と res2 を result_array にコピーするのに最も時間がかかるようです。それを最適化する方法はありますか?