面向 Android* 应用的先进英特尔® C++ 编译器特性

目录

在安卓系统中使用英特尔® Cilk™ Plus 运行时间库实现应用的多线程

英特尔® Cilk™ Plus 是对 C 语言和 C++ 的扩展,可快捷、轻松地利用多核和矢量处理的优势。 三个英特尔 Cilk Plus 关键词提供了简单但是功能强大的并行编程模式,运行时间和模板库为并行应用的构建提供良好的环境。

要想使用英特尔 Cilk Plus 实现应用的多线程,必须链接至 Cilk 运行时间库(libcilkrts.so)。

使用英特尔 C++ 编译器和 NDK build 系统(ndk-build)进行开发

NDK build 系统未将 C++ 函数库链接至使用 C 语言编写的模块,因此,在链接过程中,编译器无法选择正确的英特尔 Cilk Plus 函数库,这将导致链接错误。

1. 将一个 C++ 空文件添加至项目以便支持 C++ 链接至 NDK build 系统

2. 在 Application.mk 文件中指定兼容的 C++ 实施:

  • 'APP_STL:=stlport_shared' or
  • 'APP_STL:=gnustl_static' or
  • 'APP_STL:=gnustl_shared'

3. 按照下文“准备 JNI 调用”章节中的说明修改您的 Java 代码

使用独立英特尔 C++ 编译器而不使用 NDK build 系统(ndk-build)进行开发

如果您的开发环境包含 C++ 代码,您需要明确链接至 GNU_STL 库或 stlport 库。

请按以下步骤操作:

1. 对于 NDK 中包含的 C++ 实施的链接与编译,请指明以下标记:

  • 编译标记:
    -I$ANDROID_GNU_LIBSTDCPP/include -I$ANDROID_GNU_LIBSTDCPP/libs/x86/include
  • 链接标记(gnustl_shared):
    -L$ANDROID_GNU_LIBSTDCPP/libs/x86 -lgnustl_shared -lsupc++
  • 链接标记(gnustl_static):
    -L$ANDROID_GNU_LIBSTDCPP/libs/x86 -lgnustl_static -lsupc++

其中,
ANDROID_GNU_LIBSTDCPP=$NDK/sources/cxx-stl/gnu-libstdc++/4.6. 4.6 应更换为由 ANDROID_GNU_X86_TOOLCHAIN 指向的 GCC 版本。 例如,如果 ANDROID_GNU_X86_TOOLCHAIN 指向 $NDK/toolchains/x86-4.8/prebuilt/linux-x86,则 4.6 应更换为 4.8。
当使用英特尔 Cilk Plus 时,您需要链接至 libcilkrts.so 库。 该库位于 /compiler/lib/ia32/gnustl 目录中。

2. 如果使用 stlport_shared C++ 库(至少需要 NDK r9),需要添加以下标记:

  • 编译标记:
    -I$ANDROID_STLPORT_LIBSTDCPP/stlport
  • 链接标记:
    -L$ANDROID_STLPORT_LIBSTDCPP/libs/x86 -lstlport_shared

其中
ANDROID_STLPORT_LIBSTDCPP=$NDK/sources/cxx-stl/stlport

如果使用英特尔 Cilk Plus,相应的 libcilkrts.so 库位于 /compiler/lib/ia32/stlport 目录中。

准备 JNI 调用

如果使用英特尔 Cilk Plus,则需要准备 JNI 调用。 ‘libcilkrts.so’库需要通过以下 API 调用从 Java 代码中加载:
System.loadLibrary("cilkrts");

如果您的应用依赖动态 C++ 实施,则需要加载 libcilkrts.so 库之外的其它相应库:

System.loadLibrary("gnustl_shared"); 
 System.loadLibrary("cilkrts");

 System.loadLibrary("stlport_shared");
System.loadLibrary("cilkrts"); 

使用 PGO 提升 Android* OS 应用性能

档案导引优化(PGO)通过重组代码布局减少指令缓存错误、并缩减代码长度及减少分支预测失误来提高应用程序性能。 PGO 向编译器提供关于常启应用的区域。 通过了解这些区域,编译器在优化应用时会更具选择性和针对性。

相比其它操作系统,在安卓系统中使用 PGO 需要附加步骤。

1. 在 jni/Android.mk 文件中为 C 标记添加以下选项:
LOCAL_CFLAGS:= -prof-gen -prof-dir /sdcard

2. 添加 WRITE_EXTERNAL_STORAGE 许可,支持应用将 PGO 输出写至 sdcard 文件夹。 将以下命令行添加至 AndroidManifest.xml 文件:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" \>

3. 确保配置数据成功存写。 默认模式下,应用退出时自动存写配置数据。 通常情况下 Android* 应用不会退出。 使用以下选项实施应用退出,或者解决这一问题:

a. 选项 1: 从 JAVA 代码调用退出:

System.exit(0);

 

b. 选项 2: 从原生代码中显式输出 PGO 数据:

#include <pgouser.h>
	_PGOPTI_Prof_Dump_All();

 

c. 选项 3: 在应用运行过程中,使用环境变量将性能定期存写至 sdcard 文件。 让环境变量对所有应用开放,添加至 Android Image 的 init.rc 文件中:

export INTEL_PROF_DUMP_INTERVAL 5000
	export INTEL_PROF_DUMP_CUMULATIVE 1

 

注: INTEL_PROF_DUMP_INTERVAL 的测量值是微妙级,不得大于 INT_MAX。

4. 在应用的源目录中从目标到主机复制生成的动态文件:

adb pull ...

 

5. 在 Android.mk 文件中更改 C 标记以使用生成的动态文件。 您可使用 -prof-dir 参数指向不同的文件位置。
LOCAL_CFLAGS := -prof-use

请参考档案导引优化章节,英特尔® C++ Compiler XE 14.0 用户参考指南,在 Linux*、Windows* 和 OS X* 操作系统中使用英特尔 C++ 编译器构建应用的优化方法。

其它相关文章与资源

面向 Android* 的英特尔® C++ Compiler 14.0
英特尔® System Studio - 使用英特尔® Cilk™ Plus 的多核编程
英特尔® Cilk™ Plus
英特尔® C++ Compiler 14.0 用户参考指南
面向英特尔® 架构的 Android* NDK
使用 Android* x86 NDK 与 Eclipse* 的方法以及 NDK 示例应用导入方法


如需深入了解面向安卓开发人员的英特尔工具,请访问:面向安卓的英特尔® 开发人员专区

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