問題タブ [sse2]

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.

0 投票する
2 に答える
2601 参照

c++ - SSE2命令がC++のインラインアセンブリで機能しない

SSE2を使用していくつかの値を一緒に追加するこの関数があります。これは、lhsとrhsを一緒に追加し、結果をlhsに格納することになっています。

私のコードは次のような関数を使用しています:

ただし、コードを実行すると、2,4,6,8ではなく1,2,3,4が出力されるため、これは機能しません。

0 投票する
5 に答える
23661 参照

linux - LinuxがSSE2をサポートしているかどうかをテストする方法

実際に私は2つの質問があります:

  1. SSE2の互換性はCPUの問題ですか、それともコンパイラの問題ですか?
  2. CPUまたはコンパイラがSSE2をサポートしているかどうかを確認するにはどうすればよいですか?

私はGCCバージョンを使用しています:

コードをコンパイルしようとすると、次のエラーが発生します。

そしてcpuinfoこれを示した:

0 投票する
1 に答える
1618 参照

c - 64ビット固有のsimd組み込み

SSE2では次のユニオン宣言を使用しています。

アイデアは、2つの符号なしlong変数(64ビット長)をそれぞれaとbに割り当て、それらをXORして、結果をcに配置することです。

ここでは明示的な割り当て(a.data[0] = something)が機能しますが、より多くの時間が必要です。

組み込み関数を使用する予定です。を使用する_mm_set_epi64 (unsigned long x, unsigned long y)と、変数を要求し__m64ます。これらの変数をキャストすると正常に(__m64)x機能しますが、間違った結果になります。

上記のコードはエラーになります:

いくつかの代替案(組み込み関数)を提案できますか?

0 投票する
4 に答える
4072 参照

c - SIMDコードはスカラーコードよりも実行が遅くなります

elmaelmcは両方ともunsigned long配列です。res1とですres2

forループ内には、要素のXORの非simdバージョンとsimdバージョンの両方が含まれています。2番目のforループ内の最初の2行は、明示的なXORを実行しますが、残りは同じ操作のsimdバージョンを実装します。

このループは外部から何百回も呼び出されるため、このループを最適化すると、合計計算時間を短縮できます。

問題は、simdコードがスカラーコードよりも何倍も遅く実行されることです。

編集:部分的な展開を行いました

しかし、結果はあまり変わりません。それでもスカラーコードの2倍の時間がかかります。

0 投票する
2 に答える
2443 参照

c - SIMD コードとスカラー コード

次のループは何百回も実行されます。
elma and elmc are both unsigned long (64-bit) arrays, so is res1 and res2.

for ループ内では、スカラー バージョンのコード (コメント付き) は、simd コードよりも 2 倍速く実行されます。上記の行の cachegrind 出力 (命令読み取り) を以下に示します。

行1:668,460,000 2 2 2
行目2行目:668,460,000 1 1
行3:89,985,000 1 1
行4:89,985,000 1 1 行 5
:617,040,000 2 2 2
行6:44,992,500 0 0
行7:44,992,500 0 : 128,550,000 0 0 行 10: 。. . 11 行目: 205,680,000 0 0 12 行目: 205,680,000 0 0




上の図から、コメント化された (スカラー コード) は、simd コードよりもはるかに少ない数の命令を必要とするように見えます。

このコードを高速化するにはどうすればよいですか?

0 投票する
4 に答える
770 参照

c - 次のコードを高速化する方法

上記のコードは私のプログラムで何度も呼び出されます (プロファイラーは 98% を示します)。

編集: 内側のループでは、同じ (i + k) 値に対して res1[i + k] 値が何度も読み込まれます。while ループ内でこれを試してみました。すべての res1 値を simd レジスタ (配列) にロードし、最も内側の for ループ内で配列要素を使用して配列要素を更新しました。両方の for ループが完了したら、配列の値を res1、re2 に保存しました。しかし、これにより計算時間が増加します。私がどこで間違ったのか分かりますか?その考えは正しかったようです

より速くするための提案は大歓迎です。

0 投票する
3 に答える
5864 参照

c++ - SIMD:SSERGBからYUVへの色変換がc++実装とほぼ同じ速度であるのはなぜですか?

RGBからYUV420へのコンバーターを最適化しようとしました。ルックアップテーブルを使用すると、固定小数点演算を使用した場合と同様に、速度が向上しました。しかし、私はSSE命令を使用して実際の利益を期待していました。私が最初に試した結果、コードが遅くなり、すべての操作を連鎖させた後は、元のコードとほぼ同じ速度になりました。私の実装に何か問題がありますか、それともSSE命令が目前のタスクに適していないのですか?

元のコードのセクションは次のとおりです。

そしてこれがSSEを使ったバージョンです

これはSSE2での最初の試みの1つなので、何かが足りないのではないでしょうか。参考までに、私はVisualStudio2008を使用してWindowsプラットフォームで作業しています。

0 投票する
1 に答える
1539 参照

optimization - TBBを使用した少数の命令(SSE2、SSE4)によるループの最適化

私は単純な画像処理関連のアルゴリズムを持っています。簡単に説明すると、float内の画像(平均)が8ビット画像によって減算され、結果がfloat画像(宛先)に保存されます。

この関数は主に組み込み関数によって書かれています。

TBB、parrallel_forを使用してこの関数を最適化しようとしましたが、速度は向上しませんでしたが、ペナルティが発生しました。

私は何をすべきか ?コードを最適化するために、TBBタスクなどのより低レベルのスキームを使用する必要がありますか?

0 投票する
1 に答える
4281 参照

c++ - 色変換のためのいくつかのSSE2組み込み関数の高速化

YCbCrからBGRAへの画像の色変換を実行しようとしています(Aビットについては聞かないでください、そのような頭痛の種です)。

とにかく、これはできるだけ速く実行する必要があるので、SSE2を利用するためにコンパイラ組み込み関数を使用して記述しました。これはSIMDランドへの私の最初のベンチャーであり、私は基本的に初心者なので、非効率的にやっていることがたくさんあると確信しています。

実際の色変換を行うための私の算術コードは特に遅いことが判明し、IntelのVTuneはそれを重大なボトルネックとして示しています。

だから、私は次のコードをスピードアップすることができますか?一度に4ピクセルの32ビットで実行されます。私はもともと(上のループのように)一度に8ビット、16ピクセルでそれを実行しようとしましたが、計算によって整数のオーバーフローが発生し、変換が失敗します。Intel jpegデコードを含むこのプロセス全体は、フルHDの単一フィールドで最大14ミリ秒かかります。少なくとも12ミリ秒、理想的には10ミリ秒まで下げることができれば素晴らしいと思います。

ヘルプやヒントをいただければ幸いです。ありがとう!

0 投票する
2 に答える
2151 参照

vector - sse/sse2 double 行列 float ベクトル乗算

sse/sse2 を使用して行列ベクトル乗算を実装する必要があります。ベクトルと行列が大きい。行列は double、ベクトルは float です。

ポイントは、フロートで実行する必要があるすべての計算です-マトリックスからデータを取得すると、それをフロートに昇格させ、計算を行い、フロートベクトルを取得します(後でフロートで追加の計算を行った後、いくつかのフロート値を追加する必要があります(フロート行列) を double 値 (double 行列) に変換します。

私の質問は、SSE/SSE2 を使用してそれを行う方法です-問題は double にあります-double* へのポインターがあり、__mm128 に収まるように 4 つの double を 4 つの float に変換する必要があります...それを行うための指示はありますか? ?