Neon 使用小结
来源:互联网 发布:平面设计求职意向美工 编辑:程序博客网 时间:2024/06/03 06:47
测试平台:
OMAP3430 SDP。
注意点:默认TI 给的uImage或者config 都是不支持neon的,需要重新make menuconfig,来enable这个功能。
参考:http://tiexpressdsp.com/wiki/index.php?title=FAQ_OMAP35x_Linux_PSP#How_to_enable_the_NEON_coprocessor.3F
TOOLCHAIN:
arm-2007q3。 这个是GCC 官方支持neon的第一款。
编译选项:(针对内联的,汇编的话后面几个可以不用,担放着也没有问题)
CFLAGS = -s -save-temps -static -Wall -O3 -march=armv7-a -mtune=cortex-a8 -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -ftree-vectorize -fomit-frame-pointer -ffast-math
Neon参考文献:
从ARM 官方上下载DUI0204IC_rvct_assembler_guide / DUI0348BC_rvct_comp_ref_guide, 两个都有中文版本,看起来很方便。配合最新的arm_architecture_reference_manual,应该足够了。
优化方法
两种方法我都尝试了下:
1: 使用内联 http://gcc.gnu.org/onlinedocs/gcc/ARM-NEON-Intrinsics.html
2:直接使用汇编
在简单函数的时候,两种差异不大;担担随着功能负责,使用内联会导致寄存器分配不够,反复压/出栈,而性能降低。同时使用内联也没有办法调整好流水线,(感觉NEON的大多数指令包括ADD等,都不是单周期的的,具体几个周期,我没有查到)。如果用汇编调整好的话,一般能够提高30+%
感觉:
和一般SIMD 指令差不多,支持16个128bit的寄存器。可以看成 16×8bit;8×16bit; 4×32bit...。指令功能还是很全的,甚至什么max,倒数都能够支持。也支持直接读/写chuncky数据BRG,YUYV啥的,简单的IF/ELSE也能支持。
用内联写的话很方便,函数合适的话,估计半天一个很轻松,一般优化个2 -3倍没问题。如果不够的话,就用ASM精细搞下。
不足:
我遇到一个优化失败的地方。程序是个梯度计算,本来是很合适的。担输入数据和目的数据都是YUYV,而我们只要处理Y好了。结果NEON必须同时读入YUYV(再展开成planar),这样多读/写了一倍数据,结果把性能托慢了。 这个模块计算太简单,ARM本身已经很快了,读写数据已经是瓶颈了,NEON的多读写数据就把优化的效果给干掉了。如果NEON能够支持“跳”着读/写,就好了,^_^。
- Neon 使用小结
- NEON
- NEON
- Neon
- NEON
- NEON
- NEON
- 使用WEC7的NEON内在函数功能
- Android NDK使用NEON优化,SIMD优化
- NEON在Android中的使用举例
- Android NDK开发之 NEON使用介绍
- ARM NEON 编程系列3——使用ARM NEON Intrinsics加速Video Codec
- 如何在iPhone/ipad/iPod Touch中使用NEON技术
- xilinx zynq-7000中ARM NEON的使用
- 自动布局第三方Neon的基础使用
- 使用neon内部函数实现8-way de-interleave
- Eclipse Neon 使用Git与Github 方法与问题
- mac 下移植 x264 使用 neon 多线程加速
- 3x3矩阵类
- Jquery在IE7下无法使用 $.ajax解决方法
- 滚动字幕——失落的marquee
- java远程通讯及简单实现
- mvc用js动态加载模拟jquery的.ajax
- Neon 使用小结
- 使用 boost::signals2 的智能连接管理
- 2009年国家质监局公布的禁用化妆品名单
- 滚动字幕——控件的坐标属性
- Intel CPU 功耗大全
- .net教程:petshop4.0设计说明
- 滚动字幕——左滚、右滚、上滚、下滚
- JFrame JDialog
- linux多线程学习(五)---条件变量