2012-06-03 13 views
5

私はMS Visual StudioでSSE2命令セットを使って作業しています。私は16ビットのデータでいくつかの計算をするためにそれを使用しています。効率的に128ビット定数を定義するには?

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. 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} - 何が起こっているかを理解するのは難しいです。 42を例えばに変更します。 -42は簡単ではありません

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

+1

おそらく2番目の方法のマクロを使用しても問題ありません – valdo

答えて

8

戦闘の90%が正しい固有のものを見つけることです。 MSDNライブラリは、かなり整理されており、this pageから始まります。そこから、このようにドリルダウン:

  • あなたは、「MMX、SSEとSSE2組み込み関数」を使用あなたは「ストリーミングSIMD拡張命令2」を使用したい知っている
  • そのリンクをクリックして、ということをクリックします知っていますリンク
  • 次魅力リンク「整数メモリーと初期化」であるあなたは浮動小数点
  • たくないので、あなたは2つの関連リンク、ロードおよびSet操作を取得します
  • 負荷がちょうどあなたがすでに
  • を発見したものを取得します

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

2

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) 
関連する問題