我有一個大像素處理函數,目前我正試圖使用內在函數進行優化。使用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中受益的其他兩個部分之間。
你認爲誰可以改進'myLookupTable [static_cast(v)* LUT_RATIO]'?這裏沒有進行計算,SSE爲什麼適用? –
ildjarn
@ildjarn我很確定我本身不能改進這部分,但我希望改進函數的其他部分,並避免在'__m128'和'float [4]之間來回移動的懲罰「我還必須矢量化這段代碼。 – Rotem