問題タブ [simd]
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.
gcc - GCC によるバージョン管理のループ
GCC を使用した自動ベクトル化に取り組んでいます。顧客の要求により、組み込み関数または属性を使用する立場にありません。(ベクトル化をサポートするためのユーザー入力を取得できません)
ベクトル化できる配列のアラインメント情報が不明な場合、GCC は「ループ バージョン管理」のパスを呼び出します。ツリーでループのベクトル化が行われると、ループのバージョン管理が実行されます。ループがベクトル化可能であると識別され、データの位置合わせまたはデータの依存性に関する制約がそれを妨げている場合 (コンパイル時に決定できないため)、ループの 2 つのバージョンが生成されます。これらは、ループのベクトル化されたバージョンとベクトル化されていないバージョンであり、どのバージョンを実行するかを制御するためのアライメントまたは依存関係のランタイム チェックが含まれています。
私の質問は、どのようにアライメントを強制する必要があるのですか? ベクトル化可能なループが見つかった場合、アライメント情報が欠落しているため、ループの 2 つのバージョンを生成すべきではありません。
例えば。以下のコードを検討してください
ツリー ダンプ (オプション: -fdump-tree-optimized -ftree-vectorize)
「bb 3」では、ベクトル化されたコードのバージョンが生成されます。'bb 4' で、ベクトル化なしのコードが生成されます。これらは、アラインメント (ステートメント 'A') をチェックすることによって行われます。組み込み関数やその他の属性を使用せずに、ベクトル化されたコードのみを取得するにはどうすればよいですか (このランタイム アライメント チェックなし)。
hash - 大量のハッシュをハッシュした場合、ハッシュの衝突が発生する可能性はどのくらいありますか?
ファイルを識別するためにハッシュを使用しているとしましょう。そのため、ファイルを安全にする必要はありません。衝突を最小限に抑える必要があります。SIMDを使用して4つのハッシュを並行して実行し、最終結果をハッシュすることで、ハッシュを高速化できると考えていました。ハッシュが512ビットブロックを取るように設計されている場合、一度に4x512ビットブロックを取るファイルをステップスルーし、そこから4つのハッシュを生成します。次に、ファイルの最後で、結果の4つのハッシュを一緒にハッシュします。
この方法ではハッシュが貧弱になると確信しています...しかし、どれだけ貧弱ですか?エンベロープ計算の裏側はありますか?
sse - SSE2: _m128 を単語に減らす方法
_m128 (4 単語 abcd) を 1 単語に減らす最善の方法 ( sse2 ) は何ですか? 各 _m128 コンポーネントの下部が必要です。
そのための組み込み関数はありますか? ありがとう !
x86 - AVX 命令セットを現在サポートしているアセンブラはどれですか?
AVX (高度なベクトル拡張) 命令をいくつか試してみたいと思います。Intel がこれらの命令を含むソフトウェアをテストするためのエミュレーターを提供していることは知っていますが (この質問を参照)、手動で 16 進コードを書きたくないので、どのアセンブラーが現在 AVX 命令セットを認識しているかという疑問が生じます。
Windows で動作し、Intel 構文を受け入れるようにできるアセンブラに最も興味があります。
c++ - SSE およびその他の CPU 拡張機能の利用
私のコードベースには、大きなデータセットに対して同じ操作が非常に多く繰り返される場所がいくつかあります。場合によっては、これらの処理にかなりの時間がかかります。
SSE を使用してこれらのループを実装すると、特に同じデータ セットに対して多くの操作が実行される場合に、パフォーマンスが大幅に向上すると考えています。それ。しかし、私はこれについて行くことについて確信が持てません。
SSE命令を利用するためにコードを書くコンパイラとOSに依存しない方法はありますか? SSE 操作を含む VC++ 組み込み関数が気に入っていますが、クロス コンパイラ ソリューションは見つかりませんでした。
SSE サポートがない、または制限されている一部の CPU (Intel Celeron など) をサポートする必要があります。プロセスの開始時に実行されている CPU に基づいて、基本コードまたは SSE 最適化コードのいずれかにリンクするある種の「実行時リンカー」を使用するなど、プログラムの異なるバージョンを作成する必要を回避する方法はありますか?
他の CPU 拡張機能についてはどうでしょうか。さまざまな Intel および AMD CPU の命令セットを見ると、それらのいくつかが示されていますか?
c - メモリが整列しているかどうかを判断する方法は?
私は SSE/SSE2 命令を使用してコードを最適化するのは初めてで、今まであまりうまくいっていませんでした。私の知る限り、一般的な SSE 最適化関数は次のようになります。
ptr
ただし、メモリポイントが 16 バイトなどでアラインされているかどうかを正しく判断するにはどうすればよいでしょうか。この関数に渡されるすべてのメモリが整列されていることを確認できないため、整列されていないメモリの通常の C コード パスを含める必要があると思います。また、組込み関数を使用してアライメントされていないメモリから SSE レジスタにデータをロードするのは、非常に遅いようです (通常の C コードよりもさらに遅い)。
前もって感謝します...
c - 128ビットのC変数とxmmの128ビットのasmを操作する方法は?
gccでは、asmコードを介して2つのC変数で128ビットのxorを実行したい:どのように?
しかし、セグメンテーション違反エラーがあります。これはobjdumpの出力です。
c++ - SIMDまたは非SIMD-クロスプラットフォーム
可能な場合はSIMD(SSE、SPUなど)を利用できるように、いくつかの並列化可能な問題のC++クロスプラットフォーム実装を作成する方法についてのアイデアが必要です。また、実行時にSIMDではなくSIMDを切り替えられるようにしたいと考えています。
この問題に取り組むことをどのように提案しますか? (もちろん、考えられるすべてのオプションについて、問題を複数回実装したくありません)
これはC++では非常に簡単な作業ではないかもしれませんが、何かが足りないと思います。これまでのところ、私の考えは次のようになります...クラスcStreamは単一フィールドの配列になります。複数のcStreamを使用して、SoA(Structure of Arrays)を実現できます。次に、いくつかのファンクターを使用して、cStream全体で実行する必要のあるLambda関数を偽造できます。
for_eachは、ストリームの現在のポインターをインクリメントするだけでなく、SIMDを使用する場合と使用しない場合でファンクターの本体をインライン化する役割を果たします。
そのようなもの:
SIMDが有効になっている場合は、一度チェックすると、ループがメインファンクターの周りにあることに注意してください。
arm - 一般的な SIMD 手法
一般的な SIMD トリックに関する情報はどこにありますか? 私は命令セットを持っており、トリッキーでない SIMD コードの書き方を知っていますが、SIMD は今でははるかに強力です。複雑な条件分岐のないコードを保持できます。
たとえば ( ARMv6
)、次の一連の命令は、Rd の各バイトを Ra と Rb の対応するバイトの符号なし最小値に等しく設定します。
チュートリアルへのリンク / 珍しい SIMD テクニックも良いです :) ARMv6は私にとって最も興味深いものですが、x86 (SSE、...)/ Neon (ARMv7)/その他も良いです。
assembly - 2 つの x86 32 ビット レジスタを 128 ビット xmm レジスタに格納する
2 つの x86 32 ビット レジスタを 1 つの 128 ビット xmm レジスタに格納するより高速な方法はありますか?
したがって、EAX が0x12345678
で EDX が0x87654321
の場合、xmm0 の結果は でなければなりません0x8765432112345678
。