【发布时间】:2015-08-01 22:32:16
【问题描述】:
我在 Neon 和 arm 组件中实现了一个计算机视觉 卷积 算法,其中每个像素都替换为九个自身和相邻像素的和积。主循环如下所示:
.loop:
vld1.u8 {d0}, [line_prev]
add line_prev, line_prev, #1
vld1.u8 {d1}, [line_prev]
add line_prev, line_prev, #1
vld1.u8 {d2}, [line_prev]
add line_prev, line_prev, #6
vld1.u8 {d3}, [line]
add line, line, #1
vld1.u8 {d4}, [line]
add line, line, #1
vld1.u8 {d5}, [line]
add line, line, #6
vld1.u8 {d6}, [line_next]
add line_next, line_next, #1
vld1.u8 {d7}, [line_next]
add line_next, line_next, #1
vld1.u8 {d8}, [line_next]
add line_next, line_next, #6
//Everything is loaded now. Let's multiply and sum
vmull.u8 q10, d0, d10 //d10 to d18 holds the kernel matrix values
vmlal.u8 q10, d1, d11
vmlal.u8 q10, d2, d12
vmlal.u8 q10, d3, d13
vmlal.u8 q10, d4, d14
vmlal.u8 q10, d5, d15
vmlal.u8 q10, d6, d16
vmlal.u8 q10, d7, d17
vmlal.u8 q10, d8, d18
vshrn.u16 d4, q10, d19 //Shift the sum by the value in d19
vst1.u8 {d4}, [out]! //Store result
subs temp, temp, #8 //We have processed 8 pixels
bgt .loop
如何优化(在速度方面)这个循环?有什么更聪明的方法可以加载像素。此外,q11... 可用:我应该使用它们来并行处理 vmull 和 mlal 指令吗?
【问题讨论】:
-
如果您以特定 CPU 为目标,需要调查的一件事是预取。手动插入预取指令可以加快速度,但仅限于给定的缓存大小和代码配置。如果您的程序可移植到不同的 Cortex 模型,请忘记手动预取,除非您想为每个模型维护有条件编译的代码。
-
我的目标是一个特定的 ARM,又名。 OMAP4 双皮质-A9。