問題タブ [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++ - 64ビット×64ビットの乗算でカラツバアルゴリズムを使用するのは本当に効率的ですか?
私は AVX2 に取り組んでおり、64 ビット x64 ビット -> 128 ビットの拡大乗算を計算する必要があり、最速の方法で 64 ビットの上位部分を取得しました。AVX2 にはそのような命令がないので、カラツバ アルゴリズムを使用して効率と速度を上げることは合理的ですか?
gcc - AVX/AVX2 組み込み関数を使用したアラインおよびアラインされていないメモリ アクセス
Intel の Software Developer Manual (14.9 節) によると、AVX はメモリ アクセスのアライメント要件を緩和しました。データが処理命令に直接ロードされた場合。
ロード アドレスを揃える必要はありません。ただし、次のような専用のアライメントされたロード命令が使用されている場合
ロードアドレスは (32 の倍数に) アラインされている必要があります。アラインされていない場合、例外が発生します。
私を混乱させているのは、組み込み関数からの自動コード生成です。私の場合は gcc/g++ (4.6.3、Linux) によるものです。次のテストコードを見てください。
(はい、アラインされていないアドレスに対してアラインされたロードを使用しているため、コードに問題があることはわかっていますが、ご容赦ください...)
コードをコンパイルします
AVXを搭載したCPU上。を使用してg ++によって生成されたコードを確認すると
コンパイラはアラインされたロード命令を生成せず、ベクトル加算命令でデータを直接ロードすることがわかります。
メモリ アドレスがアラインされていない (OFFSET が 1) 場合でも、コードは問題なく実行されます。vaddps はアラインされていないアドレスを許容するため、これは明らかです。
2 番目の加算組み込み関数の行のコメントを外すと、vaddps はメモリ ソース オペランドを 1 つしか持てないため、コンパイラはロードと加算を融合できず、次のように生成します。
そして、専用のアラインされたロード命令が使用されているため、プログラム seg-fault が発生しますが、メモリ アドレスはアラインされていません。(ちなみに、_mm256_loadu_ps を使用するか、OFFSET を 0 に設定すると、プログラムはセグメンテーション フォールトしません。)
私の謙虚な意見では、これにより、プログラマーはコンパイラーに翻弄され、動作が部分的に予測不能になります。
私の質問は次のとおりです。C コンパイラに、処理命令 (vaddps など) で直接ロードを生成させるか、専用のロード命令 (vmovaps など) を生成させる方法はありますか?
c++ - AVX2 で 2x4 64b 構造体の最初の行を 256b レジスタにロードする最速の方法は何ですか?
次のように定義された構造体があります。
AVX2 の _m256i 変数に最初の行をロードするにはどうすればよいですか?
c - _mm256_slli_si256: エラー「最後の引数は 8 ビットの中間でなければなりません」
次の問題があります (g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4):
_mm256_slli_si256()
次のように直接使用する場合:
コードは問題なくコンパイルされます ( g++ -Wall -march=native -O3 -o shifttest shifttest.C
)。
ただし、関数にラップすると
コンパイラはそれを不平を言う
機能の使用の有無は問いません。
_mm256_slli_si32(x, imm)
関数 doit() は代わりにeg を使用するとコンパイルされ、即値オペランドも必要になるため、これは即値オペランドでは問題になりません_mm256_slli_si32()
。
関連するバグレポートがあります
https://gcc.gnu.org/bugzilla/show_bug.cgi?format=multiple&id=54825
しかし、それはかなり古く (2012 年)、gcc 4.8.0 に関連しているため、パッチは g++ 4.8.4 に既に組み込まれていると思いました。
この問題の回避策はありますか?
intel - インテルが SIMD ISA をより互換性のある、または普遍的な方法で設計しないのはなぜですか?
Intel には、SSE、AVX、AVX2、AVX-512、Xeon Phi 上の IMCI など、いくつかの SIMD ISA があります。これらの ISA は、さまざまなプロセッサでサポートされています。たとえば、AVX-512 BW、AVX-512 DQ、および AVX-512 VL は Skylake でのみサポートされ、Xeon Phi ではサポートされません。AVX-512F、AVX-512 CDI、AVX-512 ERI、および AVX-512 PFI は、Skylake と Xeon Phi の両方でサポートされています。
インテルは、すべての先進プロセッサーで実行できる、より汎用的な SIMD ISA を設計しないのはなぜですか?
また、インテルは、ISA の開発時にいくつかの組み込み関数を削除し、新しい組み込み関数を追加しています。多くの組み込み関数には多くのフレーバーがあります。たとえば、パックされた 8 ビットで動作するものもあれば、パックされた 64 ビットで動作するものもあります。一部のフレーバーは広くサポートされていません。たとえば、Xeon Phi には、パックされた 8 ビット値を処理する機能がありません。ただし、Skylakeにはこれがあります。
Intel がその SIMD 組み込み関数を一貫性のない方法で変更するのはなぜですか?
SIMD ISA 同士の互換性が高ければ、既存の AVX コードをより少ない労力で AVX-512 に移植できます。
c - AVX2 疎行列乗算
新しい AVX2 GATHER 命令を活用して、スパース行列 (ベクトル乗算) を高速化しようとしています。行列は、列を保持する列インデックス配列を指す行ポインターを持つ CSR (または Yale) 形式です。このような mat-vec mul の C コードは次のようになります。
私の目標は、AVX2 組み込み関数を使用してこれを高速化することです。次のコードは、 https://blog.fox-toolkit.org/?p=174に基づいて、最新の Intel または GCC で動作します。とにかく、私の行はすべて4つのダブル(列%4 == 0)で整列するため、ここで残りを削除しました(幸運なことに)。誰かが興味を持っている場合は、残りを処理するコードもありますが、ポイントは、コードが実際には少し遅いということです。逆アセンブルを確認したところ、上記のバージョンでは FP 命令のみが生成され、私の AVX2 コードではすべての AVX2 ops が期待どおりに表示されます。キャッシュに収まる小さな行列であっても、AVX2 バージョンは役に立ちません。私はここで困惑しています...
どんな提案でも大歓迎です。
どうもありがとう、クリス