NDK支持NEON环境配置:https://blog.csdn.net/app_12062011/article/details/50462351
一个很典型的例子:http://hilbert-space.de/?p=22
neon android ndk:https://github.com/Lakers2005

一、入门

1. 并行操作模式的模式[Mapping,Reduce,Scatter,Stencil]

2. NEON指令使用举例,NEON指令提供的核心能力有数据的装载、存储以及数据的处理。NEON指令都是以V字母开头。

VADD.I16 q0, q1, q2

其中,V表示NEON指令头,ADD为加法运算,I表示整形,I16表示16位整形,q0,q1,q2都是128位寄存器。指令的意思是让q1,q2装载8个16位数据,然后执行加法操作,最后放倒q0寄存器中,一次指令完成了8此加法运算,也就性能提升了8倍。

如果把RGB三个元素分别放到3个不同的寄存器中,每个寄存器的元素分别都是R、G、B,这样就可以进行并行晕算了。

二、NDK中如何使用NEON

1. 确认处理器是否支持NEON

cat /proc/cpuinfo | grep neon 

2. 引入头文件arm_neon.h

#include <arm_neon.h> 

3. 修改CMakeList.txt

# make a list of neon files and add neon compiling flags to them
set(neon_SRCS helloneon-intrinsics.c)
set_property(SOURCE ${neon_SRCS} APPEND_STRING PROPERTY COMPILE_FLAGS " -mfpu=neon")
add_library(hello-neon SHARED helloneon.c ${neon_SRCS})

4. c代码

void reference_convert(uint8_t *__restrict dest, uint8_t *__restrict src, int n) {
int i;
for (i = ; i < n; i++) {
int r = *src++; // load red
int g = *src++; // load green
int b = *src++; // load blue // build weighted average:
int y = (r * ) + (g * ) + (b * ); // undo the scale by 256 and write to memory:
*dest++ = (y >> );
}
} //使用NEON Intrinsics优化
void neon_convert(uint8_t *__restrict dest, uint8_t *__restrict src, int n) {
int i;
//读取8字节的预设值到64位寄存器
uint8x8_t rfac = vdup_n_u8();// 转换权值 R
uint8x8_t gfac = vdup_n_u8();// 转换权值 G
uint8x8_t bfac = vdup_n_u8();// 转换权值 B
n /= ; for (i = ; i < n; i++) {
uint16x8_t temp;
uint8x8x3_t rgb = vld3_u8 (src);//一次读取3个unit8x8到3个64位寄存器
uint8x8_t result; temp = vmull_u8(rgb.val[], rfac); // temp=rgb.val[0]*rfac
temp = vmlal_u8(temp, rgb.val[], gfac);// temp=temp+rgb.val[1]*gfac
temp = vmlal_u8(temp, rgb.val[], bfac);//temp=temp+rgb.val[2]*bfac result = vshrn_n_u16 (temp, ); // 128位寄存器每16位右移第二个参数位
vst1_u8 (dest, result); // 转存运算结果到dest
src += * ;
dest += ;
}
}

NEON优化之《简介》的更多相关文章

  1. 解决一个Ubuntu中编译NEON优化的OpenCV的错误

    在Ubuntu 16中编译开启NEON优化的Opencv时,遇到libpng编译是使用汇编代码的错误,完整错误见文章末尾.通过查询发现解决方案是安装跨平台编译器,安装代码如下: sudo apt-ge ...

  2. Oracle SQL优化器简介

    目录 一.Oracle的优化器 1.1 优化器简介 1.2 SQL执行过程 二.优化器优化方式 2.1 优化器的优化方式 2.2 基于规则的优化器 2.3 基于成本的优化器 三.优化器优化模式 3.1 ...

  3. loadrunner 脚本优化-事务时间简介

    脚本优化-事务时间简介 by:授客 QQ:1033553122 事务概念 事务是指用户在客户端做一种或多种业务所需要的操作集(actions),通过事务开始和结束函数可以标记完成该业务所需要的操作内容 ...

  4. Oracle中CBO优化器简介

    Oracle中CBO优化器简介 Oracle数据库中的优化器是SQL分析和执行的优化工具.它负责制定SQL的执行计划,也就是它负责保证SQL的执行计划的效率最高,比如优化器决定Oracle以什么样的方 ...

  5. 【Stage3D学习笔记续】山寨Starling(七):一般优化方法简介及混合模式

    关于事件的优化: 遍历注册的事件由foreach改变为fori,在大量数据遍历时会有提升: 事件池优化: 所有的事件都使用一个对象池进行保存,而不是使用到时进行创建,使用EventDispatcher ...

  6. 分享:SQL优化器简介

    SQL优化是我们经常会遇到的问题,无论你是专职的数据分析人员还是全栈开发大神或者是CURD搬运工. 我们在工作中经常会听到这样的声音:“查询慢?加个索引吧”.虽然加索引并不一定能解决问题,但是这体现了 ...

  7. SQL优化器简介

    文章导读: 什么是RBO? 什么是CBO? 我们在工作中经常会听到这样的声音:"SQL查询慢?你给数据库加个索引啊".虽然加索引并不一定能解决问题,但是这初步的体现了SQL优化的思 ...

  8. 堆优化 dijkstra 简介

    dijkstra 前言 原本我真的不会什么 dijkstra 只用那已死的 spfa ,还有各种玄学优化,可是,我不能相信一个已死的算法,就像我不能相信自己. ps : 虽然他已经活了 序 我站在镜子 ...

  9. ARM NEON指令集优化理论与实践

    ARM NEON指令集优化理论与实践 一.简介 NEON就是一种基于SIMD思想的ARM技术,相比于ARMv6或之前的架构,NEON结合了64-bit和128-bit的SIMD指令集,提供128-bi ...

随机推荐

  1. Java面向对象(概述,构造函数,类与对象的关系,this关键字,成员、局部),匿名对象的调用,构造代码块(5)

    Java面向对象(概述,构造函数,类与对象的关系,this关键字,成员.局部),匿名对象的帝爱用,构造代码块(5)

  2. mysql6数据库安装与配置

    详细步骤可以参考这篇文章 https://www.cnblogs.com/duguangming/p/10623520.html 1.下载并打开mysql6数据库安装文件 2.默认点击下一步 3.点击 ...

  3. JAVA中常用的异常处理情况

    1.java.lang.nullpointerexception程序遇上空指针 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者 ...

  4. java.sql.BatchUpdateException: ORA-01691: Lob 段 CSASSSMBI.SYS_LOB0000076987C00003$$ 无法通过 128 (在表空间 HRDL_CSASS 中) 扩展

    问题: 在tomcat日志信息中出现:java.sql.BatchUpdateException: ORA-01691: Lob 段 CSASSSMBI.SYS_LOB0000076987C00003 ...

  5. UML-类图-箭头

    概览 1.泛化 一般理解为 继承.实线+空心箭头 2.依赖 成员变量.局部变量.参数.虚线+箭头 public class Sale { public void updatePriceFor(Prod ...

  6. Codeforces620E New Year Tree

    挺好的一道题 Description link 给一棵树,每个点有颜色 \(c_i\) 为点权,需要实现以下两种操作: 子树修改颜色(覆盖),查询子树颜色种类 \(n \leq 4 \times 10 ...

  7. nginx四层负载及动静分离

    阿里云实验10.0.0.132 LB10.0.0.133 web0110.0.0.134 web02 步骤:1.安装nginx1.14 获取官网repo文件 yum install -y nginx ...

  8. sklearn 缺失值填补(总结)

    首先查看数据形态: data.shape 再查看数据类型和非空值的个数与比例 data.info() 使用SimpleImputer进行填补 from sklearn.impute import Si ...

  9. 第2章 Innodb 存储引擎

    一.InnoDB 体系架构 1.1后台线程 master thread:刷新内存中的数据到磁盘 io thread:处理 IO 请求,AIO purge thread:清理undo 页的回收 page ...

  10. Python 学习笔记:Python 连接 SQL Server 报错(20009, b'DB-Lib error message 20009, severity 9)

    问题及场景: 最近需要使用 Python 将数据写到 SQL Server 数据库,但是在进行数据库连接操作时却报以下错误:(20009, b'DB-Lib error message 20009, ...