使用 Intel® 本征指令在 Android* 上进行功耗/性能优化的代码示例





5.00/5 (1投票)
使用 Intel® 本征指令在 Android* 上进行功耗/性能优化的代码示例
Intel® Developer Zone 提供跨平台应用开发工具和操作指南、平台和技术信息、代码示例以及同行专业知识,以帮助开发人员创新和取得成功。加入我们的社区,了解 Android、物联网、Intel® RealSense™ 技术 和 Windows,下载工具、获取开发套件、与志同道合的开发人员分享想法,并参加黑客松、竞赛、路演和本地活动。
引言
毋庸置疑,电池续航能力,尤其是移动设备的电池续航能力,对用户至关重要。我们都曾遇到过在最需要的时候电量耗尽的情况——在导航到新城市时、在进行重要通话时等等。这可能不是完全显而易见的,但通过优化应用程序性能,开发人员可以降低功耗,这有助于用户。
结合使用 Intel® Graphics Performance Analyzers 和 VTune™ Amplifier 分析应用
提高应用程序功耗/性能的第一步是什么?首先,您必须了解您的应用是受 CPU 还是 GPU 限制。您可以使用 Intel® 工具组合来完成此操作
Intel® Graphics Performance Analyzers 或 GPA 是一个用于 Microsoft DirectX* 应用程序和 Android* OpenGL ES* 应用程序的图形分析和优化工具。您可以在此处了解更多信息:https://software.intel.com/en-us/articles/gpa-which-version
为了进行 Android 优化,我更倾向于使用 GPA 控制台客户端。您可以在此处阅读相关信息:https://software.intel.com/en-us/android/articles/using-intel-graphics-performance-analyzers-console-client-for-android-application
VTune™ Amplifier 帮助您分析算法选择,并确定您的应用程序可以在何处以及如何利用可用的硬件资源。使用 VTune Amplifier 来定位或确定以下内容:
- 您的应用程序和/或整个系统中耗时最多的函数(热点)
- 未能有效利用处理器时间的代码段
- 用于优化顺序性能和多线程性能的最佳代码段
- 影响应用程序性能的同步对象
- 您的应用程序在输入/输出操作上花费时间的情况、地点和方式
- 不同同步方法、不同线程数或不同算法的性能影响
- 线程活动和转换
- 代码中与硬件相关的瓶颈
配置主机系统(Linux*、OS X* 或 Windows*)上的数据收集,并在远程系统(Linux 或 Android)上运行分析。VTune Amplifier for Systems 支持在 Android 和嵌入式 Linux 系统上进行远程分析。
您可以在此处阅读更多内容:https://software.intel.com/en-us/node/496918
下图展示了如何结合使用 GPA 和 VTune Amplifier 来分析和优化您的应用程序。
什么是 Intel® 本征指令
Intel® 本征指令是汇编代码函数,允许您使用 C/C++ 函数调用和变量来代替汇编指令。本征指令提供了对 C 和 C++ 语言标准结构无法生成的指令的访问。
本征指令是内联展开的,消除了函数调用开销。与使用内联汇编提供相同的好处一样,本征指令提高了代码可读性,有助于指令调度,并有助于减少调试。
您可以在此处阅读更多内容:https://software.intel.com/en-us/node/523351
如何在项目中查找并连接 Intel® C++ Compiler for Android* OS?
Intel® C++ Compiler for Android* OS 包含在 Intel® INDE 套件中。Inte®l C++ Compiler for Android* 集成了 Android NDK,并提供了一个优化的替代方案来编译 x86 库。
下载并安装 Intel C++ Compiler for Android。在安装过程中,提供 NDK 目录的路径,以便将 Intel C++ Compiler for Android 集成到 Android NDK 中。
成功安装后,Intel® C++ Compiler for Android 将自动集成到 Android NDK 工具链中,并为 x86 架构编译优化库。
示例
为了演示 Intel 本征指令的用法,我们来看一段 C++ 代码
Float x = 1.0f / sqrtf( y );
这类代码(尤其是在物理算法中)经常出现在热点中。
通过在 VTune Amplifier 中分析此字符串,分析结果将显示编译器生成的是 sqrt + div 而不是 rsqrt。
修复方法是使用 Intel 本征指令
Float x = rsqrt( y );
其中 rsqrt 是
#include … inline float rsqrt(const float x) { float r; _mm_store_ss(&r, _mm_rsqrt_ss( _mm_load_ss(&x))); return r; }
关于作者
Stanislav Pavlov 在 Intel 公司软件与服务集团工作。他在技术领域拥有 10 多年的经验。他的主要兴趣是优化性能、功耗和并行编程。在他目前担任高级应用工程师,为 Intel® 设备提供技术支持的职位上,Stanislav 与软件开发人员和 SoC 架构师密切合作,帮助他们在 Intel® 平台上实现最佳性能。Stanislav 拥有俄罗斯国家高等经济研究大学数学经济学硕士学位。他目前正在莫斯科商学院攻读 MBA。