加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何优化循环?

发布时间:2020-12-16 03:34:11 所属栏目:百科 来源:网络整理
导读:我有以下瓶颈功能. 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
我有以下瓶颈功能.
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条指令.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读