2012-05-14 12 views
10

私は現在、組み込み関数を使用して最適化しようとしている大きなピクセル処理関数を持っています。SIMDを使用したルックアップテーブル

SSE初心者であるため、ルックアップテーブルを含むコードの部分にどのように取り組むべきかわかりません。

基本的に、私は次のバニラC++コードをベクトル化しようとしています:

//outside loop 
const float LUT_RATIO = 1000.0F; 

//in loop 
float v = ... //input value 
v = myLookupTable[static_cast<int>(v * LUT_RATIO)]; 

私がしようとしているもの:

//outside loop 
const __m128 LUT_RATIO = _mm_set1_ps(1000.0F); 

//in loop 
__m128 v = _mm_set_ps(v1, v2, v3, v4); //input values 
__m128i vI = _mm_cvtps_epi32(_mm_mul_ps(v, LUT_RATIO)); //multiply and convert to integers 
v = ??? // how to get vI indices of myLookupTable? 

編集:ildjarnは私の一部に明確化を要求ポイントになります。私はルックアップテーブルコードのスピードアップを達成しようとしているわけではありません。SSEから理論的に利益を得ることができる2つの部分に挟まれているので、ルックアップを行うためにレジスタを特にフロートに戻さないようにしています。

+0

あなたはあなたが 'myLookupTable [static_cast (v)* LUT_RATIO]'で改善できると確信していますか?ここでは計算が行われません.SSEはなぜ適用可能でしょうか? – ildjarn

+2

@ildjarn私はこの部分を改善することはできませんが、関数の他の部分を改善し、 '__m128'と' float [4] 'の間を行き来することを避けることを望んでいます。私はこのコードをベクトル化する必要があります。 – Rotem

答えて

12

次の年まで待つことができれば、IntelのHaswell CPUには、収集された負荷のための命令を含むAVX2があります。これにより、たとえば1つの命令で8つの並列LUTルックアップ(例えば、VGATHERDPSを参照)。 LUTが非常に小さい(16個の要素など)場合を除き、PSHUFBを使用することができます。

+0

残念ながら私のLUTは10000個の要素です。新しいプロセッサーを待っていたとしても、ハスウェルを最小CPUとして指定するのが正当になるまでには数年かかるでしょう。 :) 情報をありがとう。 – Rotem

+1

OK - LUTを近似することができます。多項式を使用すると、SSEでまだ勝つことができます。そうでなければ、あなたはスカラーコードに悩まされています。 –

+3

スカラーコードです。これは良いニュースですが、私はこの部分について心配することなく、より最適化可能と思われる部分について作業を進めることができます。 – Rotem

関連する問題