Android之性能监控框架
[TOC]
概述cmake –build . 和cmake ../cmake ./make 有什么区别?
通过cmake ./cmake .. 命令创建Makefile文件后,一般使用make命令编译文件。
这里的cmake –build .就与make一样的效果。
另外,还有cmake –build . –target xxx这个命令。
如果xxx用help替换,可以看到xxx可以替换若干选项。例如cmake –build . –target all/ cmake –build . –target clean等
Android之性能监控框架
[TOC]
概述假设我们需要生成一个可执行文件,该文件生成需要链接a.so b.so c.so d.so四个动态库
正常来讲,我们一把只需要以下两条指令即可:
12ADD_EXECUTABLE(main main.cpp)TARGET_LINK_LIBRARIES(main a.so b.so c.so d.so)
但是编译的时候报错,一些符号的定义找不到,而这些符号恰恰就在这几个库中,假设在a.so 和 b.so中,在上述两条指令之间加上一条指令即可编译通过:
1ADD_DEPENDENCIES(main a.so b.so)
原因比较简单,生成main需要依赖a.so和b.so中的符号定义,然而a.so和b.so库的生成是在main编译生产之后的,添加这条语句就是提醒编译器需要先生成main的依赖(a.so,b.so),然后再去生成main.
Android之性能监控框架
[TOC]
概述在很多时候,需要在cmake中创建一些目标,如clean、copy等等,这就需要通过add_custom_target来指定。同时,add_custom_command可以用来完成对add_custom_target生成的target的补充。
本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2019Q4/20191029。
add_custom_target如果你写过MakeFile,那么一定知道,可以设定很多的目标来make,如:
12target ... : prerequisites ... command
其中:
target是下面的命令的目标,即下面命令是为了target而生的。这个目标可以是*.o文件,也可以是可执行文件;
prerequisites则是生成该目标所依赖的文件,如果找不到依赖的文件,下面的命令就不会执行且会中断make;
command就是生成目标文件的命令,一般就是编译命令。
那么,如果使用CMakeLists.txt如何也生成 ...
ARM平台上的NEON加速基础
[TOC]
概述文章参考:https://arm-software.github.io/acle/neon_intrinsics/
文章参考:https://developer.arm.com/documentation/102467/0100/
文章参考:https://zhuanlan.zhihu.com/p/358603760
文章参考:https://zhuanlan.zhihu.com/p/143328317
文章参考:https://www.jianshu.com/p/16d60ac56249
文章参考:https://blog.csdn.net/chshplp_liaoping/article/details/12752749
文章参考:http://blog.csdn.net/chshplp_liaoping/article/details/12752749
文章参考:https://github.com/Denislyl/MyTechBlog2/issues/5
文章参考:https://blog.csdn.net/weixin_43475286/article/de ...
ARM平台上的NEON加速基础
[TOC]
概述NEON加速指令介绍汇编指令格式AArch64 与AArch32 / Armv7-A 的 NEON 汇编指令除了种类上存在差异,格式上也存在很大差异。
其中指令中有一些通用的书写格式, 含义如下:
{}, 表示可选项
<>, 表示必选项
AArch64汇编指令格式1{<prefix>}<op>{<suffix>} Vd.<T>, Vn.<T>, Vm.<T>
<prefix> 表示前缀名字,包括以下几类:
S/U/F/P:表示数据类型,分别为 有符号整型/无符号整型/浮点型/布尔型。
Q:表示饱和(Saturating)计算。
R:表示舍入(Rounding)计算, Rounding 操作等价于加上 0.5 之后再截断。
H:表示折半(Halving)计算。
D:表示翻倍(Doubling)算。
<op> 表示具体的操作,例如 ADD,SUB 等 ...
ARM平台NEON instrinsics指令学习
[TOC]
概述文章参考:https://zhuanlan.zhihu.com/p/441686632
官网指令集汇总:https://arm-software.github.io/acle/neon_intrinsics/advsimd.html#markdown-toc-addition
文章参考:https://developer.arm.com/architectures/instruction-sets/intrinsics
intrinsics指令分类正常指令:生成大小相同且类型通常与操作数向量相同的结果向量;
长指令:对双字向量操作数执行运算,生成四字向量的结果。所生成的元素一般是操作数元素宽度的两倍,并属于同一类型;
宽指令:一个双字向量操作数和一个四字向量操作数执行运算,生成四字向量结果。所生成的元素和第一个操作数的元素是第二个操作数元素宽度的两倍;
窄指令:四字向量操作数执行运算,并生成双字向量结果,所生成的元素一般是操作数元素宽度的一半;
饱和指令:当超过数据类型指定的范围则自动限制在该范围内。
功能类别
介绍
Load/Store
对数据进 ...
ARM平台上使用NEON加速完成3X3 max pool实现
[TOC]
概述代码示例
ARM平台上的图像格式转换的NEON加速函数实现
[TOC]
概述文章参考:https://blog.csdn.net/Yemiekai/article/details/108009701
ARGB转gray为了比较性能,现在用neon和纯C方法比较一下将彩色图片转成灰度的时间
1234567891011121314151617181920212223242526//纯C函数void method_argb2gray_c(AndroidBitmapInfo info, void *pixels) { // rgb转灰度值公式 // Gray = (R*38 + G*75 + B*15) >> 7 cv::TickMeter tm1; tm1.start(); uint32_t *pixel = NULL; int a = 0, r = 0, g = 0, b = 0; int rows=info.height; int cols=info.width; for (int y = 0; y < rows; ++y) { for (i ...
ARM平台上NEON加速常用的函数
[TOC]
概述文章参考:http://blog.csdn.net/may0324/article/details/72847800
文章参考:https://blog.csdn.net/fengbingchun/article/details/38085781
代码示例NEON 技术是 ARM Cortex™-A 系列处理器的 128 位 SIMD(单指令,多数据)架构扩展,旨在为消费性多媒体应用程序提供灵活、强大的加速功能,从而显著改善用户体验。它具有 32 个寄存器,64 位宽(双倍视图为 16 个寄存器,128 位宽。)目前主流的iPhone手机和大部分android手机都支持ARM NEON加速,因此在编写移动端算法时,可利用NEON技术进行算法加速,以长度为4的寄存器大小为例,相应的提速倍数约是原始的4倍。
NEON 指令可执行“打包的 SIMD”处理:
寄存器被视为同一数据类型的元素的矢量
数据类型可为:签名/未签名的 8 位、16 位、32 位、64 位单精度浮点
指令在所有通道中执行同一操作
float32x4_t本文主要介绍float32x4_t相 ...
ARM平台上YUV420SP转RGB实践优化
[TOC]
概述文章参考:https://zhuanlan.zhihu.com/p/397551265
练习用 C++ + arm neon + openmp 多线程优化。记录 7680x4320 大小的 NV21 图像转为 RGB 图像, 在 Android ARMv8 平台的耗时从 100ms 左右优化到 10 ms 的过程。
每次测试,循环 10 次取平均,以得到稳定耗时。绑定大核心, openmp 加速时使用4个大核心加速。
naive 实现naive 实现,不求速度,但求使用了正确的公式、实现过程无差错。
单个函数实现多个功能