【图像算法优化】开篇:simd-library介绍及几个优化技巧
2017-04-01 00:14
387 查看
本系列主要涉及图像处理算法的优化技巧,都是通过学习simd-library中的代码,然后进行总结,包括basic部分跟neon优化部分。
simd-library是用于图像处理的算法库,里面大量的用了SIMD指令对常用的图像处理算法进行优化,github的项目地址为:https://github.com/ermig1979/Simd
本文先开个胃,介绍下几个觉得挺有意思的函数:
摘取自:https://github.com/ermig1979/Simd/blob/master/src/Simd/SimdMath.h
可以看到这里有两个点需要注意:
1) inline的用法:对于这种比较轻量又经常用到的操作,可以写成inline函数,省去频繁调用的堆栈问题,提升效率。当然,在c语言中,也可以用宏定义代替。
2)可以看到这里都有 +1跟+2的操作,使得最终结果有四舍五入的效果
这里将把输入a,b按照大小进行排序,如果a < b,则不变;否则,交换数值。
逐步过程如下:
if d > 0 , then:
d>>8, d= 0; m = 0xffffffff;
b+= (a-b) = a; a -=(a-b) = b;
if d < 0 , then:
d>>8, d =0xffffffff; m = 0;
b+=0=b; a-=0=a;
这里的trick相当于就是:通过移位来获取数值的符号信息。
从函数名可以知道,这是用于8bit的数值,所以右移8bit可以获取到该数值的符号。在计算机中,负数右移后会得到0xffff ffff;而正数则是0x0。然后通过位操作来得到最终的结果,避免采用条件判断的方式来提升性能。
类似的,还有以下几个函数,也是用的类似的技巧:
后续将根据不同的算法,详述算法过程及对应的优化技巧。
simd-library是用于图像处理的算法库,里面大量的用了SIMD指令对常用的图像处理算法进行优化,github的项目地址为:https://github.com/ermig1979/Simd
本文先开个胃,介绍下几个觉得挺有意思的函数:
摘取自:https://github.com/ermig1979/Simd/blob/master/src/Simd/SimdMath.h
1、求平均
SIMD_INLINE int Average(int a, int b) { return (a + b + 1) >> 1; } SIMD_INLINE int Average(int a, int b, int c, int d) { return (a + b + c + d + 2) >> 2; }
可以看到这里有两个点需要注意:
1) inline的用法:对于这种比较轻量又经常用到的操作,可以写成inline函数,省去频繁调用的堆栈问题,提升效率。当然,在c语言中,也可以用宏定义代替。
2)可以看到这里都有 +1跟+2的操作,使得最终结果有四舍五入的效果
2、排序
SIMD_INLINE void SortU8(int & a, int & b) { int d = a - b; int m = ~(d >> 8); b += d & m; a -= d & m; }
这里将把输入a,b按照大小进行排序,如果a < b,则不变;否则,交换数值。
逐步过程如下:
if d > 0 , then:
d>>8, d= 0; m = 0xffffffff;
b+= (a-b) = a; a -=(a-b) = b;
if d < 0 , then:
d>>8, d =0xffffffff; m = 0;
b+=0=b; a-=0=a;
这里的trick相当于就是:通过移位来获取数值的符号信息。
从函数名可以知道,这是用于8bit的数值,所以右移8bit可以获取到该数值的符号。在计算机中,负数右移后会得到0xffff ffff;而正数则是0x0。然后通过位操作来得到最终的结果,避免采用条件判断的方式来提升性能。
类似的,还有以下几个函数,也是用的类似的技巧:
3、绝对值差,最大值,最小值
SIMD_INLINE int AbsDifferenceU8(int a, int b) { int d = a - b; int m = d >> 8; return (d & ~m)|(-d & m); } SIMD_INLINE int MaxU8(int a, int b) { int d = a - b; int m = ~(d >> 8); return b + (d & m); } SIMD_INLINE int MinU8(int a, int b) { int d = a - b; int m = ~(d >> 8); return a - (d & m); } SIMD_INLINE int SaturatedSubtractionU8(int a, int b) { int d = a - b; int m = ~(d >> 8); return (d & m); }
后续将根据不同的算法,详述算法过程及对应的优化技巧。
相关文章推荐
- SSE图像算法优化系列一:一段BGR2Y的SIMD代码解析。
- 本文简要介绍了几个优化 Apache 的技巧
- SSE图像算法优化系列九:灵活运用SIMD指令16倍提升Sobel边缘检测的速度(4000*3000的24位图像时间由480ms降低到30ms)。
- 几个优化 Cacti 监控服务性能的技巧
- C++11新特性应用--介绍几个新增的便利算法(关于最大值和最小值的算法)
- c#图像处理的几个技巧
- 嵌入式图像处理算法优化
- SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)
- Java 语言常用性能优化技巧介绍
- 图像缩放算法及速度优化——(一)最近邻插值
- windows server 2008 R2 几个优化技巧
- 几个优化字符串操作性能的技巧
- hq2x算法放大灰度图像,如何优化?
- 机器学习初探-常用优化算法介绍
- 图像缩放算法及速度优化
- 图像插值算法--SAI算法介绍
- C++11新特性应用--介绍几个新增的便利算法(更改容器中元素顺序的算法)
- 几个简单的算法实现(冒泡优化)
- 优化mysql性能的几个参数的介绍
- 图像处理的简单优化-02:算法设计