問題タブ [avx]
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.
caching - SSE/AVXを使用したパックされた二重ベクトルの一部の非時間ストア
これは、ベクトルの個々の要素を異なるメモリ位置にファンアウトすること(分散操作)に関して私が持っていた前の質問に便乗します。__m256d
私のコードは、「長い間」再びアクセスされない大量のデータをメモリに保存します。非一時的なヒントの指示を使用して、これらすべてのストアによって生成されるキャッシュ汚染の量を減らしたいと思います。しかし、私はこれを行うための良い方法を思い付くことができません。これが私のコードが今どのように見えるかの要約です:
非テンポラルヒントを使用して64ビットストアを実行したいのですが、XMMレジスタから直接これを実行する方法はないようです。これを達成するための最良の方法は何でしょうか?
x86 - AVX2 の _mm_alignr_epi8 (PALIGNR) に相当
SSE3 では、PALIGNR 命令は次のことを実行します。
PALIGNR は、デスティネーション オペランド (第 1 オペランド) とソース オペランド (第 2 オペランド) を中間コンポジットに連結し、バイト粒度でコンポジットを定数即値分だけ右にシフトし、右揃えの結果をデスティネーションに抽出します。
私は現在、SSE4 コードを移植して AVX2 命令を使用し、128 ビットではなく 256 ビット レジスタに取り組んでいる最中です。単純に、組み込み関数_mm256_alignr_epi8
(VPALIGNR) が 256 ビット レジスタに対してのみ同じ操作を実行すると信じていました_mm_alignr_epi8
。残念ながら、そうではありません。実際、_mm256_alignr_epi8
256 ビット レジスタを 2 つの 128 ビット レジスタとして扱い、隣接する 2 つの 128 ビット レジスタに対して 2 つの「整列」操作を実行します。と同じ操作を効果的に実行します_mm_alignr_epi8
が、一度に 2 つのレジスタに対して実行します。ここに最も明確に示されています: _mm256_alignr_epi8
現在、私の解決策は、次のよう_mm_alignr_epi8
に、ymm (256 ビット) レジスタを 2 つの xmm (128 ビット) レジスタ (上位と下位) に分割して使用し続けることです。
これは機能しますが、もっと良い方法があるはずですよね? 同じ結果を得るために使用する必要がある、おそらくより「一般的な」AVX2命令はありますか?
compilation - OpenCLコードを通常のOpenCLフリーのバイナリにコンパイルできますか?
私は自分の目的のためにOpenCLを評価しています。WindowsでもMacでも、すぐに使用できるとは考えられません。理由は次のとおりです。
- WindowsにはOpenCLドライバーが必要です(もちろん、これはインストールできます)
- MacOSはMacOS>=10.6でのみOpenCLをサポートします
したがって、FPU / SSE / AVXコードとOpenCLを別々にコーディングして、2つのバイナリを生成する必要があります。1つはOpenCLをサポートしており、もう1つはOpenCLをサポートしています。
コンパイル時にOpenCLをSSE/AVXにコンパイルしてから、OpenCLを含まないバイナリを出荷できればはるかに良いでしょう。このように、FPU / SSE / AVXの個別の実装は必要ありません!
それを行う方法はありますか?
乾杯、-clemens
windows - AVXレジスタは一般的な呼び出し規約によってどのように処理されますか?
YMMレジスタが呼び出し元と呼び出し先によってどのように処理されるかを定義するドキュメントが見つかりませんでした。
私の質問に焦点を合わせるために、これが私が知りたいことです:
- 呼び出し元に戻る前に、呼び出し先が復元する必要があるYMMレジスタはどれですか。
- LinuxとWindowsではXMMレジスタに違いがあるので、YMMレジスタも同じルールに従わないと思います。各OSのルールは何ですか?
編集:以下の回答のおかげで、Win64の前述のドキュメントで回答を清掃することができました。Linuxも同様のルールに従っていると確信しています。
c++ - SSE の代わりに AVX 組み込み関数を使用しても速度は向上しません。なぜですか?
私はかなり長い間 Intel の SSE 組み込み関数を使用しており、パフォーマンスが向上しています。したがって、AVX 組み込み関数が私のプログラムをさらに高速化することを期待していました。残念ながら、これまではそうではありませんでした。おそらく私はばかげた間違いをしているので、誰かが私を助けてくれたらとてもありがたいです.
g++ 4.6.1 で Ubuntu 11.10 を使用しています。プログラムをコンパイルしました(以下を参照)
テスト システムには Intel i7-2600 CPU が搭載されています。
これが私の問題を例示するコードです。私のシステムでは、出力が得られます
計算 sqrt(sqrt(sqrt(x))) は、メモリ帯域幅が実行速度を制限しないようにするためにのみ選択されていることに注意してください。これは単なる例です。
シンプルな例.cpp:
どんな助けでも大歓迎です!
c++ - md5 ベクトル化された sse* && avx
ベクトル化を使用した md5 アルゴリズムの実装に関する情報を探しています。SSE* と AVX 命令の詳細に興味があります。ベクトル化をサポートする既製のライブラリーはありますか?
linux - AVX に最適化されたコードが Linux Redhat 5.6 で実行されない
Linux Redhat 5.6でicc v12.1を使用するためにAVXに最適化されたコードを生成しようとしているいくつかの簡単なテストコードがあります。コードは次のようになります。
そして、それを次のようにコンパイルします (ベクトル レポートには、ループがベクトル化されたことが示されています)。
コードを実行すると、次のエラーが表示されます。
プロセッサが AVX 対応であることは確かですが、Redhat 5.6 で AVX に問題がある人はいますか?
optimization - 128 ビット SSE カウンター?
周期が 2^128 の __m128i 変数の関数が必要です。(カウンターのように) 単調に増加する必要はありませんが、各値に 1 回アクセスします。
私が考えることができる最も単純な例は、実際には 128 ビットのカウンターですが、SSE で実装するのは難しいことがわかりました。よりシンプルで高速なソリューションはありますか?
c - __m128にintをロードするSSE
4 int と 8 ints をints
( aligned/unaligned)にロードするための gcc の組み込みは何ですか? どうですか?__m128
__m256
unsigned ints
c - SSE ints と floats の練習
SSE (AVX) で int と float の両方を扱う場合、すべての int を float に変換し、float のみで作業することをお勧めしますか? その後は数個の SIMD 命令しか必要なく、使用する必要があるのは加算命令と比較命令 ( <, <=, ==
) だけなので、この変換が完全に保持されることを願っています。