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++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...