1. 前言
neon加速对图像处理来说(具体到算法/代码上,是指多重循环,二维矩阵的运算),往往能起到奇效,其并行计算的特点能大大加快计算的速度,提高性能。对于其使用方法,网上有不少说明,在此不再累赘。
而对于一些算法来说,条件判断是必不可少的,同时也存在这种情况:对于图像的每个像素点的处理会根据不同的条件有不同的算法式子。那么这时候使用neon加速就比较麻烦了。网上对于这种情况的介绍并没有相关的例子,在此,特写这篇文档以做说明。下面例子忽略多重循环的外包,只对某个元素组进行说明,并且这个条件判断的前提是数值比较。
2. 判断指令
neon对于条件判断的处理,具体使用到:比较,异或,与,取反等基础指令。
- 比较:相等比较(
vceq[q]_type
),大于或等于比较(vcge[q]_type
)等 - 异或:
veor[q]_type
- 与:
vand[q]_type
- 取反:
vmvn[q]_type
,结合异或
指令可以成为同或
其中比较指令有个特点:结果为true时,所有位置1,结果为false,所有位置0,所以结果只能为整型。
以vcgt -> ri = ai > bi ? 1...1:0...0
为例:
指令:uint32x4_t vcgtq_f32 (float32x4_t __a, float32x4_t __b);
float32_t data[4] = {
2.1,1.2,0.1,3.1};
float32x4_t a = vld1q_f32(data);
float32x4_t b = vdupq_n_f32(2.0);
uint32x4_t res = vcgtq_f32(a, b);//res[0]=0xFFFF,res[1]=0x0,res[2]=0x0,res[3]=0xFFFF
所以可以得知,当使用判断时,可以将比较为真
的置位,比较为假
清零,那么对于真值
的条件运算就可以通过指令与
得到对应元素的运算后的值,假值
的则会与
得的结果为0。下面举例说明。
3. 条件判断例子
以下例子为了简化原理,都使用uint
类型进行说明,如果是其他变量类型,