原文: Ne10 Library Getting Started
1 简介
ARM® NEON™ 技术是适用于 ARM Cortex™-A 系列处理器的 SIMD(单指令多数据)架构扩展。 它可以使多媒体和信号处理算法提速,例如视频编码/解码、2D/3D 图形、游戏、音频和语音处理以及图像处理等。 过去三年间,出现许多使用 NEON 并显著改善用户体验的多媒体应用程序。 有些应用程序开发人员可能不熟悉 NEON 汇编代码,因此 Ne10 库的创建可使开发人员从 ARMv7/NEON 中获得最大效益,而不必使用繁琐的汇编代码。
Ne10 库提供一组最为常用并且极为优化的函数。 这组函数最初于 2012 年 3 月发布。 库中的初始功能集着重于矩阵/矢量代数以及信号处理。 Ne10 将持续改进,以包含图像处理等多领域内的更多高计算量任务。
本文将介绍如何编译和使用 Ne10 库
2 Ne10 概述
当您从 https://github.com/projectNe10/Ne10 查看 Ne10 源代码时,您会注意到许多目录。 下图显示了每个目录的使用情况。
3 环境
首先,让我们准备整个开发环境。
您需要准备 ARM Cortex-A 系列开发平台。 如果没有硬件开发平台,也可使用仿真环境,如 Google 的 Android Emulator。 我现在使用的是装有 Ubuntu 11.10 的 Panda Board (http://pandaboard.org/)。
或者,您还可以使用传统的桌面环境进行交叉编译:
对于桌面环境,您还需要下列工具:
4 编译和使用 Ne10 库
现在,我们可以开始下载 Ne10 源代码并进行编译。
Ne10 使用 CMake 来实现整个构建系统。 使用 CMake 的优势是我们可以轻松地跨平台实施。
对于 UNIX 平台,在终端使用下列命令:(将 $NE10PATH 替换为源代码所在的目录)
$cd $NE10PATH
$mkdir build
$cd build
$cmake
$make
libNE10.a 位于 $NE10PATH /build/modules/,测试程序“NE10_test_static”位于 $NE10PATH /build/samples/。 您可以运行该命令。 不妨添加 –
DNE10_BUILD_SHARED=ON 至 cmake 调用,以生成动态库和测试程序“NE10_test_dynamic”。
交叉编译的流程与本机编译的流程类似。 只需创建 config.cmake 并将此文件放在 $NE10PATH/,即可配置正确的工具链。
set( CMAKE_C_COMPILER arm-linux-gnueabi-gcc )
set( CMAKE_CXX_COMPILER arm-linux-gnueabi-g++ )
set( CMAKE_ASM_COMPILER arm-linux-gnueabi-as )
find_program(CMAKE_AR NAMES "arm-linux-gnueabi-ar")
mark_as_advanced(CMAKE_AR)
find_program(CMAKE_RANLIB NAMES "arm-linux-gnueabi-ranlib")
mark_as_advanced(CMAKE_RANLIB)
然后,您可以使用下列命令进行编译。
$cmake -DCMAKE_TOOLCHAIN_FILE=../config.cmake ..
Ne10 库与测试示例放在与以上本机编译相同的目录中。 您可以将它们复制到目标位置并运行。
备注:
当您在目标位置运行 NE10_test_dynamic 时,您可能会收到出错消息:“NE10_test_dynamic:在加载共享库时出错:libNE10_shared.so.10:无法打开共享的对象文件:不存在此类文件或目录”
您可以运行下列命令:
$export LD_LIBRARY_PATH=$NE10PATH/build/modules
经过以上流程,Ne10 库已就绪。 我将通过一个示例介绍如何使用 Ne10 库。
1) 源代码
您可以直接通过以下方法调用 Ne10 函数。
#include <stdio.h>
#include <stdlib.h>
#include "NE10.h"
main(void)
{
ne10_int32_t i;
ne10_float32_t thesrc[5];
ne10_float32_t thecst;
ne10_float32_t thedst1[5];
ne10_float32_t thedst2[5];
for (i=0; i<5; i++)
thesrc[i] = (ne10_float32_t) rand()/RAND_MAX*5.0f;
}
thecst = (ne10_float32_t) rand()/RAND_MAX*5.0f;
ne10_addc_float_c( thedst1 , thesrc, thecst, 5 );
ne10_addc_float_neon( thedst2 , thesrc, thecst, 5 );
printf("==========end=========\n");
Ne10 还提供自动监测 NEON 硬件的功能。 在初始化后,函数指针将指向正确的版本(C 或 NEON)。
ne10_init( );
ne10_addc_float( thedst , thesrc, thecst, 5 );
2) 编译程序
将 $NE10_INC_PATH 和 $NE10_LIB_PATH 替换为这些文件所在的目录
备注:如果您使用动态库,并且未添加选项“-lm”,则将出现“未定义‘sqrtf’参考”错误。
然后,您可以运行此示例。
5 结论 Ne10 是针对应用程序开发人员的一个非常有用的库。 您可以从 NEON 中获得最大效益,而不必使用繁琐的汇编代码。 我希望本文能够帮助您了解如何使用 Ne10 来实现应用程序提速。 如需进一步了解 Ne10,请访问 http://projectne10.github.com/Ne10/
ne10 可以用到baremetal 环境吗?