如何优化循环?

Ale*_*tov 6 c++ optimization assembly intrinsics sse2

我有以下瓶颈功能.

typedef unsigned char byte;
void CompareArrays(const byte * p1Start, const byte * p1End, const byte * p2, byte * p3)
{
     const byte b1 = 128-30;
     const byte b2 = 128+30;
     for (const byte * p1 = p1Start; p1 != p1End; ++p1, ++p2, ++p3) {
        *p3 = (*p1 < *p2 ) ? b1 : b2;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想C++用SSE2内部函数替换代码.我试过_mm_cmpgt_epi8但它使用了签名比较.我需要无符号比较.

是否有任何技巧(SSE,SSE2,SSSE3)来解决我的问题?

注意: 在这种情况下,我不想使用多线程.

Pau*_*l R 9

而不是抵消您的签名值以使其无符号,更有效的方法是执行以下操作:

  • 用于_mm_min_epu8得到p1,p2的无符号最小值
  • 比较这个min与p2的相等性 _mm_cmpeq_epi8
  • 对于p1 <p2的元素,结果掩码现在为0x00,对于p1> = p2的元素,结果掩码为0xff
  • 您现在可以使用此掩码_mm_or_si128_mm_andc_si128选择适当的b1/b2值

请注意,总共有4条指令,而使用offset + signed比较方法则为5条指令.