5

MS Visual Studio で SSE2 命令セットを使用しています。16ビットデータでいくつかの計算を行うために使用しています。

SSEレジスタに8つの値がロードされているとします。42それらすべてに定数(例:)を追加したい。これが私のコードをどのように見せたいかです。

__m128i values; // 8 values, 16 bits each
const __m128i my_const_42 = ???; // What should i write here?
values = _mm_add_epi16(values, my_const_2); // Add 42 to the 8 values

さて、どうすれば定数を定義できますか?次の 2 つの方法が機能しますが、1 つは非効率的で、もう 1 つは醜いです。

  1. my_const_42 = _mm_set_epi16(42, 42, 42, 42, 42, 42, 42, 42)- コンパイラは、定数を「構築」するための 8 つのコマンドを生成します
  2. my_const_42 = {42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0}- 何が起こっているのか理解するのが難しい; 42eg への変更-42は簡単ではありません

128 ビット定数をより便利に表現する方法はありますか?

4

2 に答える 2

8

戦いの 90% は、正しい固有値を見つけることです。MSDN ライブラリは非常によく構成されています。このページから始めてください。そこから、次のようにドリルダウンします。

  • 「MMX、SSE、および SSE2 Intrinsics」を使用したいことがわかっている場合は、そのリンクをクリックします。
  • 「ストリーミング SIMD 拡張命令 2」を使用したいことがわかっている場合は、そのリンクをクリックします。
  • 次の魅力的なリンクは、浮動小数点が必要ないため、「整数メモリと初期化」です。
  • Load 操作と Set 操作の 2 つの関連リンクが表示されます。
  • Load は、既に見つけたものを取得するだけです

セットはゴールデン、アウト ポップ_mm_set1_epi16 (short w)

于 2012-06-03T20:57:06.767 に答える
3

SSE (または NEON) での定数の作成に関する注意事項。メモリからのデータのロードは、命令の実行に比べて非常に遅くなります。コードで作成できる定数が必要な場合は、それがより高速な選択です。コードで作成された定数の例を次に示します。

 xmmTemp = _mm_cmpeq_epi16(xmmA, xmmA); // FFFF
 xmmTemp = _mm_slli_epi16 (mmxTemp, 7); // now it has 0xFF80 (-128)

 xmmTemp = _mm_cmpeq_epi16(xmmA, xmmA); // FFFF
 xmmTemp = _mm_slli_epi16 (mmxTemp, 15); // 0x8000
 xmmTemp = _mm_srli_epi16 (mmxTemp, 11); // 0x10 (positive 16)
于 2012-06-06T02:47:21.843 に答える