Внутренние функции SSE - сравнение, если / иначе оптимизация

Я пытался оптимизировать некоторый код, который обрабатывает необработанные данные пикселей. В настоящее время реализация кода на 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.

8
задан ZeroDefect 24 January 2012 в 12:27
поделиться