浮点运算(遵守双打)在手臂架构上要快得多,而NEON不支持双打。那么为什么opencv4android不能基于float而不是double来提供更好的性能呢?
作为更好性能的一个例子,我可以提一下warpPerspective(ImgProc)。它太慢了(大约100毫秒),但后来我根据花车创建了自己的版本,瞧它花了5毫秒。(不是作为opencv的一部分重建,而是作为我自己的app / lib的一部分)
我不能基于float来分叉和构建我自己的opencv版本,因为根据我的测试,我将失去一些闭源优化的优势,这非常重要。 (我自己构建的opencv(有很多优化标志)导致warpPrespective 200-300毫秒!)
答案 0 :(得分:1)
这是代码可维护性和性能优化之间工程权衡的典型例子。
针对一组目标进行了极端性能优化的代码(因此,与原始源代码明显不同)通常无法针对不同的目标集重新进行优化。
一个人必须回到原来的#34;干净,可维护的"源代码版本,并开始进行极端性能优化的新工作。
ARM体系结构(和NEON加速)的性能近年来发生了很大变化,其方式超出了经验丰富的行业分析师的预期。所以,请给OpenCV一些爱,并且考虑到软件世界中没有多少人具备在OpenCV中开发SIMD代码的全部技能,请认真考虑一下如何为OpenCV做贡献。
提醒一下,典型的warpPerspective
(在SSE2管道中使用,不确定它是否适用于NEON管道)包含两个步骤。在第一步中,从透视矩阵生成子采样坐标矩阵,其格式类似于convertMaps
的输出。在第二步中,使用第一步中的采样坐标矩阵从输入图像中对输出矩阵中的每个像素值进行采样(使用插值),类似于remap
的工作方式。
选择此实施策略是出于其原因,但显然这个决定是在十多年前做出的,基于当时可用的硬件。值得注意的是,ARM-NEON架构可能对此策略的选择没有任何影响。
(那时候,没有人会考虑使用OpenCV去除32768 x 32768像素的图像;第一个选择就是去了一些小众GIS成像软件。事情已经发生了变化。)