65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2015年3月2日

CPOL

4分钟阅读

viewsIcon

9169

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

Intel® Developer Zone 提供跨平台应用开发工具和操作指南、平台和技术信息、代码示例以及同行专业知识,以帮助开发人员创新和取得成功。加入我们的社区,了解 Android物联网Intel® RealSense™ 技术Windows,下载工具、获取开发套件、与志同道合的开发人员分享想法,并参加黑客松、竞赛、路演和本地活动。

引言

毋庸置疑,电池续航能力,尤其是移动设备的电池续航能力,对用户至关重要。我们都曾遇到过在最需要的时候电量耗尽的情况——在导航到新城市时、在进行重要通话时等等。这可能不是完全显而易见的,但通过优化应用程序性能,开发人员可以降低功耗,这有助于用户。

结合使用 Intel® Graphics Performance Analyzers 和 VTune™ Amplifier 分析应用

提高应用程序功耗/性能的第一步是什么?首先,您必须了解您的应用是受 CPU 还是 GPU 限制。您可以使用 Intel® 工具组合来完成此操作

Intel® Graphics Performance AnalyzersGPA 是一个用于 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。

© . All rights reserved.