目录
在安卓系统中使用英特尔® 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 文件中:
[bash]export INTEL_PROF_DUMP_INTERVAL 5000 export INTEL_PROF_DUMP_CUMULATIVE 1[/bash]
注: INTEL_PROF_DUMP_INTERVAL 的测量值是微妙级,不得大于 INT_MAX。
4. 在应用的源目录中从目标到主机复制生成的动态文件:
[bash]adb pull ...[/bash]
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 示例应用导入方法
如需深入了解面向安卓开发人员的英特尔工具,请访问:面向安卓的英特尔® 开发人员专区。