c – 如何优化循环?

前端之家收集整理的这篇文章主要介绍了c – 如何优化循环?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下瓶颈功能.
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;
    }
}

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

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

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

解决方法

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

>使用_mm_min_epu8获取p1,p2的无符号最小值
>使用_mm_cmpeq_epi8将此min与p2进行比较
>对于p1<的元素,结果掩码现在为0x00对于p1> = p2的元素,p2和0xff
>您现在可以使用此蒙版与_mm_or_si128和_mm_andc_si128来选择适当的b1 / b2值

请注意,这是总共4条指令,而使用偏移符号比较方法则为5条指令.

猜你在找的C&C++相关文章