
arm
文章平均质量分 90
图波列夫
这个作者很懒,什么都没留下…
展开
-
Design and Implementation of a Highly Efficient DGEMM for 64-bit ARMv8 Multi-Core Processors
Design and Implementation of a Highly Efficient DGEMM for 64-bit ARMv8 Multi-Core Processors 针对64位 ARMv8八核处理器,设计并实现了一种基于 OpenBLAS 的高效 DGEMM。作者首先为此架构开发性能模型,然后根据理论指导用汇编语言系统地开发高度优化的 GEBP 内核。性能模型表明,优化 DGEMM 的峰值性能(效率)需要在内存层次结构的所有级别上最大化其计算内存访问比率。而提高 GEBP 的性能的主要原创 2022-01-01 11:20:01 · 2111 阅读 · 0 评论 -
TNN MatConverter Resize
TNN 的 resize 虽然分通道提供了多个接口,但底层是一起的。整个实现对于灰度图优化非常有限,而3通道或4通道的图像会有加速。缩放的映射关系较为简单,主要分为三步:原创 2021-05-09 16:53:29 · 952 阅读 · 1 评论 -
TNN MatConverter WarpAffine
TNN 的仿射变换形态介于 OpenCV 和 ncnn 之间。其处理流程与 OpenCV 较为相似并做了一些优化,不同的地方在于数据处理宽度为4,比较小。在性能表现方面中规中矩,小图上不及 ncnn。MatUtils::WarpAffine#mermaid-svg-FNwIOkXOm8kxHfXI .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color原创 2021-05-09 16:42:07 · 562 阅读 · 3 评论 -
ncnn 中的 warpAffine
ncnn 的仿射变换对于深度学习的预处理即小图变换进行了优化,速度可达到 OpenCV 的两倍。详细请参考 [opencv ncnn warpaffine 性能测试](https://zhuanlan.zhihu.com/p/355147243)。在具体实现方面,优点是简洁明快,双线性插值采用10bit 量化,比 OpenCV 精度高;缺点是边界填充仅支持常量值。下面从 ncnn 的测试代码入手进行分析。原创 2021-05-09 16:26:02 · 1362 阅读 · 4 评论 -
OpenCV 中的 remap 函数
上一篇文章中提到 warpAffine 会分块处理,将坐标映射和插值系数分别存储下来,然后借助 remap 来实现最终的映射。而 remap 会根据映射关系取源像素并加权计算出目的像素值。其最核心的计算为 RemapVec_8u。cv::remap#mermaid-svg-lLtejyb6R6MyZRLO .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;c原创 2021-04-18 11:43:59 · 7903 阅读 · 6 评论 -
OpenCV 中的 warpAffine
warpAffine 是图像处理中比较常见的一种变换,可以将图像校正或对齐。对于线性插值方式,OpenCV 首先将坐标映射保存成两张图,然后调用 remap 函数。第二步是比较耗时的部分,并且 warpPerspective 亦采用此处理。remap 通过构建查找表来存储系数乘积,这样减少了乘法运算次数。由于篇幅过长,将文章分成 warpAffine 和 remap 两部分。原创 2021-04-18 11:12:02 · 5966 阅读 · 0 评论 -
CMake 编译 rkmedia
在瑞芯微的使用手册中,rkmedia 库使用 Buildroot 编译。然而由于配置文件众多,不易定位编译过程中的问题,所以本文以 CMake 进行构建。目标平台为 RV1109/1126。编译 libdrm-rockchiprkmedia 中的组件支持选项配置,但 drm 是必需的。所以第一步需要先编译该库。首先在电脑上按照编译过程中会用到的库。sudo apt-get install xutils-devsudo apt-get install libpciaccess-dev获取 lib原创 2021-03-07 20:01:58 · 3582 阅读 · 7 评论 -
TNN MatConverter CvtColor NV21TOBGR
OpenCV 中的 carotene 对于 armv7优化较好,而 armv8下则是 NEON 实现。TNN 提供了一套图像预处理接口并且进行了汇编优化。下面以 NV21TOBGR 为例进行介绍。MatUtils无成员变量,全部为静态函数。public: //copy cpu <-> device, cpu<->cpu, device<->device, src and dst dims must be equal. static Status Co原创 2021-02-21 21:38:45 · 800 阅读 · 0 评论 -
OpenCV cvtColor BGR2YUV420
OpenCV 中的 cvtColor 将图像从一种颜色空间转换为另一种颜色空间。虽然 OpenCV 可以支持从各种 YUV 格式转换到 BGR,但反向到 YUV420 却仅能输出 I420。尽管内部有 cvtBGRtoTwoPlaneYUV 函数,但是对外没有提供。Carotene 库并无该功能,所以 cvtColorBGR2ThreePlaneYUV 使用统一向量指令(universal intrinsics)来加速,维护成本低效率同样不高。在图像大于320x240时可能会启用线程。YCbCr 色彩空原创 2021-02-13 16:35:49 · 7094 阅读 · 1 评论 -
6.47.2 Extended Asm - Assembler Instructions with C Expression Operands
使用扩展asm,您可以从汇编程序读取和写入 C 变量,并执行从汇编代码到 C 标号的跳转。扩展asm语法使用冒号(“:”)在汇编程序模板之后分隔操作数参数:asm asm-qualifiers ( AssemblerTemplate : OutputOperands [ : InputOperands [ : Clobbers ] ])asm asm-qualifiers ( AssemblerT翻译 2021-02-10 21:19:29 · 635 阅读 · 0 评论 -
理想与现实:HI3516编译Valgrind
众所周知,C/C++程序的内存问题较多。Valgrind是一个用于构建动态分析工具的工具框架。其包含的工具可以自动检测许多内存管理和线程错误,并详细剖析程序。于是,我希望在海思系列芯片上使用它。编译过程中遇到很多问题,然而一一解决之后却发现Valgrind在海思芯片上竟无用武之地。海思将内存划分成了OS内存和MMZ内存两部分,Valgrind不能正确识别MMZ内存的内存分配,会报出大量的错误。交叉编译首先下载源码,解压后使用如下脚本进行编译。需要注意的是确保--host以armv7-开头;--原创 2020-06-07 21:29:29 · 1500 阅读 · 1 评论 -
Hi3516编译 OpenCV
为Hi35xx处理器编译 OpenCV 时会遇到 NEON 无法启用的问题,报错信息如下:CMake Error at cmake/OpenCVCompilerOptimizations.cmake:535 (message): Required baseline optimization is not supported: NEON (CPU_BASELINE_REQUIRE=;VFP...原创 2020-03-22 22:36:52 · 5653 阅读 · 5 评论 -
用 Neon Intrinsics 优化 C 代码
以下内容翻译自:Optimizing C Code with Neon Intrinsics概述本指南向您展示如何在 C 或 C++ 代码中使用 Neon intrinsics 函数,以利用 Armv8架构中的 Advanced SIMD 技术。这些简单的示例演示了如何使用这些内嵌原语,并提供了一个解释其用途的机会。希望使用 Advanced SIMD 技术的底层软件工程师、库编写人员和其他...翻译 2020-02-01 17:55:49 · 4273 阅读 · 0 评论 -
Caffe2移动端GPU支持列表
Caffe2移动端GPU支持列表移动端是Caffe2是发力的方向之一。Caffe2支持通过OpenGL调用移动GPU。然而移动端GPU却无法保持桌面上对CPU的优势,多CPU核心配弱GPU更是安卓界的一大特色。即使强大如iPhone,对于iPhone 6s以下的设备,NNPACK加速的CPU实现也比Apple的MPSCNNConvolution性能好。AndroidAndroid支持设备列表:#if原创 2017-10-31 17:37:05 · 2323 阅读 · 0 评论 -
Arm Compute Library Architecture
Core vs Runtime librariesCore库是低级算法实现的集合,它被设计为嵌入到现有的项目和应用程序中:它不分配任何内存(所有的内存分配/映射必须由调用者处理)。它不执行任何类型的多线程(但向调用者提供有关工作负载如何拆分的信息)。运行时库是Core库非常基本的封装,可用于快速原型,这是意味着它很基础:它使用标准的malloc()分配图像和张量。它使用非...原创 2018-05-16 13:57:50 · 5650 阅读 · 2 评论