Я пытался оптимизировать некоторый код, который обрабатывает необработанные данные пикселей. В настоящее время реализация кода на C ++ слишком медленная, поэтому я пытался найти какие-то основания, используя встроенные функции SSE (SSE / 2/3 не использует 4) с MSVC 2008. Учитывая, что это мой первый раз, когда я копаюсь на этом низком уровне, я ' я добился значительных успехов.
К сожалению, я пришел к определенному фрагменту кода, в котором я застрял:
//Begin bad/suboptimal SSE code
__m128i vnMask = _mm_set1_epi16(0x0001);
__m128i vn1 = _mm_and_si128(vnFloors, vnMask);
for(int m=0; m < PBS_SSE_PIXELS_PROCESS_AT_ONCE; m++)
{
bool bIsEvenFloor = vn1.m128i_u16[m]==0;
vnPxChroma.m128i_u16[m] =
m%2==0
?
(bIsEvenFloor ? vnPxCeilChroma.m128i_u16[m] : vnPxFloorChroma.m128i_u16[m])
:
(bIsEvenFloor ? vnPxFloorChroma.m128i_u16[m] : vnPxCeilChroma.m128i_u16[m]);
}
В настоящее время я по умолчанию использую реализацию C ++ для этого раздела, потому что Я не совсем понимаю, как это можно оптимизировать с помощью SSE - я считаю, что встроенные функции SSE для сравнения немного сложны.
Любые предложения / советы будут очень признательны.
РЕДАКТИРОВАТЬ: Эквивалентный код C ++, который обрабатывает один пиксель за раз, будет выглядеть так:
short pxCl=0, pxFl=0;
short uv=0; // chroma component of pixel
short y=0; // luma component of pixel
for(int i = 0; i < end-of-line, ++i)
{
//Initialize pxCl, and pxFL
//...
bool bIsEvenI = (i%2)==0;
bool bIsEvenFloor = (m_pnDistancesFloor[i] % 2)==0;
uv = bIsEvenI ==0
?
(bIsEvenFloor ? pxCl : pxFl)
:
(bIsEvenFloor ? pxFl : pxCl);
//Merge the Y/UV of the pixel;
//...
}
По сути, я выполняю нелинейное растяжение края от 4: 3 до 16: 9.