問題タブ [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.
performance - SIMD/SSE 初心者: シンプルな画像フィルタリング
私は SIMD/SSE が初めてで、簡単な画像フィルタリング (ぼかし) をしようとしています。以下のコードは、水平方向の単純な [1 2 1] 重み付けを使用して、8 ビット グレー ビットマップの各ピクセルをフィルター処理します。一度に 16 ピクセルの合計を作成しています。
少なくとも私にとって、このコードの非常に悪い点は、挿入/抽出が多く含まれていることです。これはあまりエレガントではなく、おそらくすべてを遅くすることにもなります。シフト時にデータを 1 つの reg から別の reg にラップするより良い方法はありますか?
buf は、16 バイトでアラインされたイメージ データです。w/h は幅と高さで、16 の倍数です。
x86 - sse 命令を使用した複雑な Mul および Div
複雑な乗算と除算を SSE 命令で実行することは有益ですか? SSE を使用すると、足し算と引き算のパフォーマンスが向上することがわかっています。SSE を使用して複雑な乗算を実行し、パフォーマンスを向上させる方法を誰かに教えてもらえますか?
c - ARM Cortex-a8 で乗算および累算組み込み関数を使用する方法は?
GCC が提供する Multiply-Accumulate 組み込み関数の使用方法は?
この関数に渡さなければならない 3 つのパラメーターを誰か説明できますか? ソースレジスタとデスティネーションレジスタ、および関数が返すものを意味しますか?
ヘルプ!!!
c++ - 線形代数用のC++テンプレートライブラリであるEigenを使用するにはどうすればよいですか?
私は行列を作成する画像処理アルゴリズムを持っています。私は自分の行列演算コード(乗算、逆数...)を持っています。しかし、私が使用しているプロセッサはARM Cortex-A8プロセッサで、ベクトル化用のNEONコプロセッサがあります。マトリックス操作はSIMD操作の理想的なケースであるため、コンパイラ(-mfpu = neon -mfloat-abi = softfp)にNEONを生成するように依頼しました。私のコードの命令ですが、コンパイラーはそうすることができず、Matrix操作用に独自のNEON組み込みコードを書き込もうとしましたが、それを行うのは非常に困難でした。
そこで、行列演算のベクトル化を約束する固有ライブラリを利用することを考えました。そこで、すぐにEigen C ++ライブラリをダウンロードして、チュートリアルのとおりに使用してみましたが、残念ながら、サンプルプログラムを実行するとコンパイルエラーが発生します。
Eigenの使用経験がある人は誰でも、どんな例が本当に役に立ちますか?親切にそれについて行く方法を私に助けてください。
ヘルプ!
ありがとう
/ home / ubuntu / Documents / eigenにEigenフォルダーがあります。このパスは、EclipseのC++プロジェクトの追加ディレクトリに設定します。次に、次のプログラムを実行します(例)-
私が得るエラー-
プロジェクトTest_Eigenの構成デバッグのビルド****
すべて作る
ビルドファイル:../ main.cpp
呼び出し:Sourcery G ++C++コンパイラ
arm-none-linux-gnueabi-g ++ -I / home / ubuntu / Documents / eigen -O0 -g3 -Wall -c -fmessage-length = 0 -fcommon -MMD -MP -MF "main.d" -MT "main .d "-mcpu = cortex-a8 -marm -o" main.o "
"../main.cpp"
../main.cpp:6:エラー:'int' makeの前にコンストラクタ、デストラクタ、または型変換が必要です:***[main.o]エラー1
c - SIMDは価値がありますか?より良いオプションはありますか?
かなりうまく動作するコードがいくつかありますが、もっとうまく動作させたいと思います。私が抱えている主な問題は、ネストされたforループが必要なことです。外側のものは反復用であり(これは連続して発生する必要があります)、内側のものは検討中の各点粒子用です。外側のものについてできることはあまりないことは知っていますが、次のようなものを最適化する方法があるかどうか疑問に思っています。
SIMDについてはあまりわかりませんが、SIMDを調べました。データを適切に抽出してパックするために必要な処理が、明らかに半分の命令を実行するだけの価値があるかどうかは完全にはわかりません。一度に2つのダブルを使用できます。
shmとpthread_barrierを使用して複数のスレッドに分割しようとしましたが(上記のコードが1つであるさまざまなステージを同期するため)、速度が低下しました。
私の現在のコードはかなり速く進みます。これは、10Mのパーティクル*反復ごとに1秒のオーダーであり、gprofからわかるように、私の時間の30%はその関数だけに費やされています(5000回の呼び出し、PART_COUNT = 8192パーティクルは1.8秒かかりました)。小さくて一定の時間のことは心配していません。512Kの粒子*50Kの反復*1000回の実験が前回1週間以上かかっただけです。
私の質問は、これらの長いベクトルを単にループするよりも効率的な方法があるかどうかだと思います。あるべきだと思いますが、見つかりません。
algorithm - SIMD命令を使用して3x3マトリックス逆行列は可能ですか?
ARM Cortex-A8ベースのプロセッサを使用しており、3x3行列の逆演算を計算する場所がいくつかあります。
Cortex-a8プロセッサにはNEONSIMDプロセッサがあるため、このコプロセッサを3x3マトリックス逆行列に使用することに興味があるので、いくつかの4x4実装(Intel SSEおよびfreevec)を見ましたが、3x3行列逆行列操作が実行された場所はどこにもありませんでしたSIMD命令を使用します。freevecで使用される方法は、4x4行列を4つ、2x2行列に分割し、それぞれに対して小さな操作を実行し、最終的に結果を再結合して4x4行列の逆行列を取得することです。3x3マトリックスではそのような機会は見当たりません。
SIMD命令を使用して3x3マトリックス反転を実行する方法を知っている人はいますが、それは私にとって非常に役立ちますか?
よろしくVikram
simd - NEON SIMDを使用して2行の要素をマージする方法は?
私は
私は私と2列を持っています、
これらからどうやって得ることができますか -
これらの 2 つの行をマージできる単一の NEON SIMD 命令はありますか? または、組み込み関数を使用して可能な限り最小限の手順でこれを達成するにはどうすればよいですか?
zip/unzip組み込み関数を使用することを考えましたが、 zip 関数が返すデータ型はfloat32x2x2_t、私には適していませんfloat32x4_t。データ型が必要です。
optimization - SSE2 組み込み関数: メモリーに直接アクセス
多くの SSE 命令では、ソース オペランドを 16 バイト アラインされたメモリ アドレスにすることができます。たとえば、さまざまな (un) pack 命令。PUNCKLBW には次の署名があります。
PUNPCKLBW xmm1, xmm2/m128
現在、これは組み込み関数ではまったく可能ではないようです。_mm_load* 組み込み関数を使用してメモリ内の何かを読み取ることが必須のようです。これは、PUNPCKLBW の組み込みです。
__m128i _mm_unpacklo_epi8 (__m128i a、__m128i b);
(私の知る限り、__m128i 型は常に XMM レジスタを参照します。)
さて、これはなぜですか?メモリを直接アドレス指定することで最適化の可能性が見られるので、かなり悲しいです...
c - パックされたSSEフロートの反転サイン
SSEレジスターにパックされた4つのフロートすべてのサインを反転させる最も効率的な方法を探しています。
Intelアーキテクチャソフトウェア開発マニュアルでこれを行うための本質を見つけていません。以下は私がすでに試したことです。
いずれの場合も、コードを100億回ループして、実時間を示しました。単項マイナス演算子のみを使用する非SIMDアプローチでは、少なくとも4秒を一致させようとしています。
[48秒]
_mm_sub_ps( _mm_setzero_ps(), vec );
[32秒]
_mm_mul_ps( _mm_set1_ps( -1.0f ), vec );
[9秒]
コンパイラは-O3を含むgcc4.2です。CPUはIntelCore2Duoです。
x86 - SSEアクセス違反
私はコードを持っています:
これから私は得ます:
プログラムを実行すると、_mm_add_ps行でエラーが発生します。
オリジナルは_aligned_malloc(...、16);を使用して割り当てられます。同様に関数に渡されるので、sseについての私の理解では、それが整列されていないということではありません。
理由がわからないので、なぜこれがクラッシュするのか誰かがわかるのだろうか。
編集:幅と列は常に4の倍数です。列は0または4ですが、幅は常に4の倍数です。
EDIT2:元の配列が整列されていないようです。しません:
オリジナルが関数内で整列されていることを確認しますか?
Edit3:これは実際には本当に奇妙です。私がする時:
アサートは失敗します