背景(如果你愿意,跳过这个)
首先让我说我不是专家程序员.我是一名年轻的初级计算机视觉(CV)工程师,我在C++编程方面经验丰富,主要是因为大量使用了优秀的OpenCV2 C++ API.我所学到的只是通过执行项目的需要,解决问题和满足最后期限的需要,因为这是行业的现实.
最近,我们开始为嵌入式系统(ARM板)开发CV软件,我们使用普通的C++优化代码.然而,与传统计算机相比,由于其有限的资源,在这种架构中构建实时CV系统是一个巨大的挑战.
那是我发现NEON的时候.我已经阅读了很多关于此的文章,但这是一个相当新的主题,因此没有太多关于它的信息,我阅读的越多,我得到的就越混乱.
问题
我正在寻找使用NEON功能优化C++代码(主要是一些用于循环),一次计算4或8个数组元素.是否有某种库或一组函数可以在C++环境中使用?我混淆的主要原因是我看到的几乎所有代码snipets都在Assembly中,我完全没有背景,而且在这一点上也不可能学习.我在Linux Gentoo中使用Eclipse IDE来编写C++代码.
UPDATE
看完答案后,我用软件做了一些测试.我使用以下标志编译了我的项目:
-O3 -mcpu=cortex-a9 -ftree-vectorize -mfloat-abi=hard -mfpu=neon
Run Code Online (Sandbox Code Playgroud)
请记住,这个项目包括大量的库,如openframeworks,OpenCV和OpenNI,所有内容都是用这些标志编译的.为了编译ARM板,我们使用Linaro工具链交叉编译器,GCC的版本是4.8.3.您是否希望这可以改善项目的性能?因为我们没有经历任何变化,考虑到我在这里阅读的所有答案,这是相当奇怪的.
另一个问题:所有for循环都有明显的迭代次数,但其中许多循环遍历自定义数据类型(结构或类).GCC能否优化这些周期,即使它们遍历自定义数据类型?
我有一个使用英特尔内在函数的C应用程序,如:
__m128 _mm_add_ps (__m128 a, __m128 b)
__m128 _mm_sub_ps (__m128 a, __m128 b)
__m128 _mm_mul_ps (__m128 a, __m128 b)
__m128 _mm_set_ps (float e3, float e2, float e1, float e0)
void _mm_store_ps (float* mem_addr, __m128 a)
__m128 _mm_load_ps (float const* mem_addr)
Run Code Online (Sandbox Code Playgroud)
现在,我正在尝试修改我的应用程序,以便使用名为Gem5的模拟器使其在ARMv8上运行.所以,我开始寻找ARM内在函数,我发现了这个手册ARM®NEON™内在函数参考
好吧,我找到了算术内在函数,但是我对设置,存储和加载指令有点失落.
有ARM内在函数经验的人可以告诉我正确的内在函数吗?