这篇文章我们先来认识一下DeltaCV中CPU上做的相关优化工作,使用SSE及AVX指令集优化加权灰度化过程,并进行阈值分割。
OpenCV中的过程
1 |
|
可以看到,上述过程涉及三个步骤:分离通道,加权计算,阈值分割。
可以优化的地方还是两点:
- 并行优化
- 一次遍历
DeltaCV中的优化
函数原型
1 |
|
加载变量
1 |
|
主要是将两个阈值及加权系数加载进变量中,注意这里是使用的__m256i
类型,因为我们后面进行的计算和判断都将在AVX指令集上进行。
循环主体
1 |
|
上述代码主要是加载图像中的像素,一次加载了96个(与之前的48不同),然后先使用SSE指令构造出BG(B 0 G 0 B 0 G 0…)和RC(R 0 0 0 R 0 0 0…)组合,然后再将它们拼接为__m256i
,为什么不直接在AVX上进行呢?因为AVX中的shuffle指令在这里用起来不太合适,当然也能构造出想要的数据,但是会多出很多额外的运算,大家可以试一试,如果更搞笑的方法,请在github的issues提出。
加权计算及阈值分割
1 |
|
首先将4组数据进行加权运算得到4个__m256i
变量,这个就是灰度空间的像素值,然后最后再接上阈值判断,处于范围中的置255,其它置0.
收尾
1 |
|
老规矩,不足一个block的单独处理。
性能对比
处理1000次取平均值
Image Size: 1024 x 1280(H x W)
opencv函数耗时: 1.56 - 1.69 ms
DeltaCV函数耗时: 0.39 - 0.46 ms
加速比: 3.39 - 4.33