私は現在、組み込み関数を使用して最適化しようとしている大きなピクセル処理関数を持っています。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つの部分に挟まれているので、ルックアップを行うためにレジスタを特にフロートに戻さないようにしています。
あなたはあなたが 'myLookupTable [static_cast(v)* LUT_RATIO]'で改善できると確信していますか?ここでは計算が行われません.SSEはなぜ適用可能でしょうか? –
ildjarn
@ildjarn私はこの部分を改善することはできませんが、関数の他の部分を改善し、 '__m128'と' float [4] 'の間を行き来することを避けることを望んでいます。私はこのコードをベクトル化する必要があります。 – Rotem