2
Я выполняю побитовое НЕ операции над пикселями в изображении с использованием SSE.SSE Intrinsics - логическая НЕ оптимизация
У меня есть несколько вопросов:
- Может ли это быть оптимизирована дальнейшим использованием OpenMP?
- Есть ли узкие места в моем алгоритме, которые можно оптимизировать?
Вот мой код:
unsigned int iSSE2Size = (SrcImage1.GetHeight() * (SrcImage1.GetStepBytes() >> 1)) >> 3;
__m128i *m_ucSrcPtr = (__m128i *)SrcImage1.GetWordPtr();
__m128i *m_ucDstPtr = (__m128i *)DestImage.GetWordPtr();
__m128i iMaxVal = _mm_set1_epi16(0xFFFF);
unsigned short *srcRowPtr, *dstRowPtr;
while (iSSE2Size-- > 0)
{
*m_ucDstPtr = _mm_andnot_si128(*m_ucSrcPtr, iMaxVal);
m_ucSrcPtr++;
m_ucDstPtr++;
}
Вы пробовали разворот цикла? – Mehrdad
Можете ли вы обернуть это в функцию, которая на самом деле компилируется, поэтому мы можем посмотреть на выход компилятора? –
Почему бы вам просто не использовать '_mm_set1_epi16 (65535)', и пусть компилятор беспокоится о том, как получить данные там. (подсказка, она будет лучше работать, чем хранить в локальном массиве в стеке, а затем загружать оттуда). Реестр всех-тех может быть сгенерирован «на лету» с помощью 'pcmpeqw, то же самое, а CPU распознают эту идиому как не зависит от старого значения, например, для xor-обнуления. Пусть компилятор сделает это за вас.) –