NEON优化之《简介》
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优化之《简介》的更多相关文章
- 解决一个Ubuntu中编译NEON优化的OpenCV的错误
		
在Ubuntu 16中编译开启NEON优化的Opencv时,遇到libpng编译是使用汇编代码的错误,完整错误见文章末尾.通过查询发现解决方案是安装跨平台编译器,安装代码如下: sudo apt-ge ...
 - Oracle SQL优化器简介
		
目录 一.Oracle的优化器 1.1 优化器简介 1.2 SQL执行过程 二.优化器优化方式 2.1 优化器的优化方式 2.2 基于规则的优化器 2.3 基于成本的优化器 三.优化器优化模式 3.1 ...
 - loadrunner 脚本优化-事务时间简介
		
脚本优化-事务时间简介 by:授客 QQ:1033553122 事务概念 事务是指用户在客户端做一种或多种业务所需要的操作集(actions),通过事务开始和结束函数可以标记完成该业务所需要的操作内容 ...
 - Oracle中CBO优化器简介
		
Oracle中CBO优化器简介 Oracle数据库中的优化器是SQL分析和执行的优化工具.它负责制定SQL的执行计划,也就是它负责保证SQL的执行计划的效率最高,比如优化器决定Oracle以什么样的方 ...
 - 【Stage3D学习笔记续】山寨Starling(七):一般优化方法简介及混合模式
		
关于事件的优化: 遍历注册的事件由foreach改变为fori,在大量数据遍历时会有提升: 事件池优化: 所有的事件都使用一个对象池进行保存,而不是使用到时进行创建,使用EventDispatcher ...
 - 分享:SQL优化器简介
		
SQL优化是我们经常会遇到的问题,无论你是专职的数据分析人员还是全栈开发大神或者是CURD搬运工. 我们在工作中经常会听到这样的声音:“查询慢?加个索引吧”.虽然加索引并不一定能解决问题,但是这体现了 ...
 - SQL优化器简介
		
文章导读: 什么是RBO? 什么是CBO? 我们在工作中经常会听到这样的声音:"SQL查询慢?你给数据库加个索引啊".虽然加索引并不一定能解决问题,但是这初步的体现了SQL优化的思 ...
 - 堆优化 dijkstra 简介
		
dijkstra 前言 原本我真的不会什么 dijkstra 只用那已死的 spfa ,还有各种玄学优化,可是,我不能相信一个已死的算法,就像我不能相信自己. ps : 虽然他已经活了 序 我站在镜子 ...
 - ARM NEON指令集优化理论与实践
		
ARM NEON指令集优化理论与实践 一.简介 NEON就是一种基于SIMD思想的ARM技术,相比于ARMv6或之前的架构,NEON结合了64-bit和128-bit的SIMD指令集,提供128-bi ...
 
随机推荐
- java查看简单GC日志
			
测试代码: public class GCtest { public static void main(String[] args) { for (int i = 0; i < 10000; i ...
 - Python笔记_第四篇_高阶编程_进程、线程、协程_2.线程
			
1. 线程概述: 在一个进程的内部,要同时干多件事情,就需要同时运行“多个子任务”,我们把进程内的这些“子任务”叫做线程.也就说线程是进程成的子任务. 线程通常叫做情景的进程.线程是通过向内侧控件的并 ...
 - 在项目中ES6语法转ES5语法  babel转码器
			
es6 babel 安装以及使用 1,安装好node(需要使用npm包管理工具) 2,在本地项目路径下npm init,格式化成功后会在项目下生成一个配置文件package.json 3,本地安装 ...
 - Storm 重启排查
			
Storm实战常见问题及解决方案 https://www.cnblogs.com/catkins/p/5302634.html Storm 重启排查(续) https://www.iteye.com/ ...
 - 吴裕雄--天生自然 PHP开发学习:MySQL子句
			
<?php $con=mysqli_connect("localhost","username","password","d ...
 - Sublime Text3 作Markdown编辑器 配置
			
准备 Sublime 配置 1 Package Control 2 安装插件 测试 其他 1. 准备 Windows操作系统 Sublime Text3 编辑器 Web浏览器 2. Sublime 配 ...
 - Adaboost算法及其代码实现
			
. . Adaboost算法及其代码实现 算法概述 AdaBoost(adaptive boosting),即自适应提升算法. Boosting 是一类算法的总称,这类算法的特点是通过训练若干弱分类器 ...
 - 使用pythonnet调用halcon脚本
			
最近的项目中遇到了使用python程序结合不同部分,其中包括使用halcon处理拍摄到的图像. halcon本身提供了c++与.NET的开发库,但无python库,网上有pyhalcon之类的库,但功 ...
 - linux版本neo4j安装配置教程
			
https://blog.csdn.net/weixin_44293236/article/details/89467489
 - tomcat更新class不生效
			
替换线上lib里的class不生效,需要想想是不是前人为了图方便在classes里面扔了一份老版本class