使用英特尔® IPP 构建 Android* NDK 应用

英特尔 IPP 为图像处理、信号处理、向量数学和小矩阵计算提供了高度优化的构造块函数。 同时在几个 IPP 域中针对英特尔(R) 凌动™ 处理器提供了可以手动调整的函数,利用的是英特尔® 流 SIMD 扩展 (Intel® SSE) 指令。IPP 静态非线程 Linux* 库现在支持 Android* 操作系统,同时可以和 Android 应用一起使用。

本文将为您介绍如何将英特尔 IPP 函数添加到 Android NDK 应用中。 英特尔 IPP 提供了处理器特有的优化功能,同时只能关联到本地 Android C/C++ 代码上。为了在您的应用中使用英特尔 IPP,您需要在您的源代码中包含英特尔 IPP 函数,同时你还需要将 IPP 库添加到构建命令行中。

使用英特尔 IPP

1. 在源文件中添加英特尔 IPP 函数

  • 在源文件中加入英特尔 IPP 头文件 (ipp.h)
  • 在使用任何其他 IPP 函数之前调用 ippInit()。英特尔 IPP 检测到处理器的特性之后为目标处理器选择出适合的优化代码路径。在调用任何其他英特尔 IPP 函数之前,先调用 ippInit() 以便为英特尔 IPP 初始化 CPU 调度
  • 在您的 C/C++ 源代码中调用英特尔 IPP 函数。

2. 在 Android NDK 构造文件中添加英特尔 IPP 库

  • 将英特尔 IPP 库和头文件拷贝到您的项目文件夹中。
  • 找到该应用所需的英特尔库: 英特尔 IPP 库被分成不同的域。 每个域都有自己的库,其中一些域的库彼此相互依赖。需要将所有的域库和它们的依赖库包含在联动线之内。查看“英特尔 IPP 库依赖关系”文章,了解所需的英特尔 IPP 库。
  • 将 IPP 库添加到 android 构建脚本文件 “jni/Android.mk”之中:
    将每个 IPP 库声明为预构建库模块。 例如,如果该应用使用两个英特尔 IPP 库 — "libipps.a" 和 "libippcore.a",请将以下代码添加到文件中:

include $(CLEAR_VARS)
LOCAL_MODULE := ipps
LOCAL_SRC_FILES := ../ipp/lib/ia32/libipps.a
include $(PREBUILT_STATIC_LIBRARY)

 

include $(CLEAR_VARS)
LOCAL_MODULE := ippcore
LOCAL_SRC_FILES := ../ipp/lib/ia32/libippcore.a
include $(PREBUILT_STATIC_LIBRARY) 

 

添加头文件路径和 IPP 库到调用 IPP 函数的模块中:

  
include $(CLEAR_VARS)
LOCAL_MODULE     := IppAdd
LOCAL_SRC_FILES  := IppAdd.c
LOCAL_STATIC_LIBRARIES := ipps ippcore
LOCAL_C_INCLUDES := ./ipp/include
include $(BUILT_SHARED_LIBRARY)

构建一个示例代码

下面给出的简单示例中说明了如何在本地 Android 代码中使用英特尔 IPP。 该代码使用英特尔 IPP 的 ippsAdd_32f() 函数为两个数组添加数据。

如欲查看英特尔 IPP 在该代码中的用法:

  1. 下载示例代码并将其解包到您的项目文件夹 (<projectdir>) 中。
  2. 了解源文件中的 IPP 用法:"jni/IppAdd.c" 文件 提供了一个本地函数 NativeIppAdd() 的实现方法。 该函数调用英特尔 IPP 的 ippsAdd_32f() 函数。"src/com/example/testippadd/ArrayAddActivity.java" 文件通过 JNI 调用本地 "NativeIppAdd()" 函数。
  3. 检查 "jni/Andriod.mk" 文件。 该文件将所需的 IPP 库添加到构建脚本中。 本示例使用的是 ippsAdd_32f() 函数,该函数属于英特尔 IPP 信号处理域。 该函数依赖 "libipps.a" 和 "libippcore.a" 库。"Andriod.mk" 文件为它们创建两个预构建库。

你在构建示例代码时可以使用 SDK 和 NDK 命令工具,也可以使用 Eclipse* IDE

    从一个命令行中构建示例

  1. 将英特尔 IPP 头文件和库拷贝到您的项目文件夹 (例如 <projectdir>/ipp) 中。 
  2. 运行项目目录中的 "ndk-build" 脚本,构建本地代码
     >cd  <projectdir> 
     ><ndkdir>/ndk-build
  3. 构建 android 包并安装应用
    >cd <projectdir>
    >android update project -p  .  -s
    >ant debug
    >adb install bin/ArrayAddActivity-debug.apk

使用 Eclipse* IDE 构建示例

  1. 将英特尔 IPP 头文件和库拷贝到您的项目文件夹 (例如 <projectdir>/ipp) 中。 
  2. 在 Eclipse 中,点击 File >> New >> Project...>>Andriod >> Andriod Project from Existing Code。 在 "Root Directory" 中,选择示例代码文件夹,然后点击 Finish
  3. 运行项目目录中的 "ndk-build" 脚本,构建本地代码:
     >cd  <projectdir> 
     ><ndkdir>/ndk-build
  4. 在 Eclipse IDE 中构建应用并部署 .apk 文件。

总结
本文通过本地 Android* 应用介绍了 IPP 的用法。 更多有关英特尔 IPP 函数的信息,请参阅 IPP 手册

有关编译器优化的更完整信息,请参阅优化通知
标签: