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

新 Android* 世界中的受信任工具: 优化技术 - 从 Intel® SSE Intrinsics 到 Intel® Cilk™ Plus

2014年9月16日

CPOL

6分钟阅读

viewsIcon

16687

本文将讨论 Android 上的优化需求和方法,并通过一个案例研究,介绍如何优化多媒体和增强现实应用程序。

引言

大多数 Android 应用程序,即使是仅基于脚本和托管语言(Java*、HTML5 等)的应用程序,最终也会使用需要优化的中间件功能。

本文将讨论 Android 上的优化需求和方法,并通过一个案例研究,介绍如何优化多媒体和增强现实应用程序。

Intel 为 Android 平台(智能手机和平板电脑)提供了多种不同的 Intel® Atom™ 处理器,这些处理器至少具备 Intel® SSSE3 级别的向量化能力,并且通常带有超线程的双核。

所以,请采纳这一建议,并利用这些优化功能!

iOnRoad* 案例研究

iOnRoad* 是一款增强现实应用程序,它利用现代计算机视觉算法的强大功能,在智能手机上提供实时个人驾驶辅助功能,例如碰撞警告。

由于是实时应用,iOnRoad 应用需要将手机摄像头生成的 YUV420/NV21 格式的输入帧转换为 RGB 格式,然后再进行处理。

原始 iOnRoad 代码的转换过程占用了 CPU 约 40% 的运行时间,限制了图像处理的使用,使得优化势在必行。

我们发现唯一可用的优化软件是 Intel® Integrated Performance Primitives 的 YUV420ToRGB 例程,但它没有 iOnRoad 应用所需的输入和输出格式的组合。而且,这个例程不是多线程的!

因此,我们决定创建新的优化代码来执行所需的转换。

YUV420/NV21 到 RGB 的转换

YUV420/NV21 格式具有 8 位亮度(黑白)Y 分量和两个色度(颜色)U 和 V 分量。

每个 Y 分量*四*需要一对相应的 V 和 U 分量,才能生成标准 RGB 格式,该格式为单个像素提供 3 个颜色分量。

上图显示了相应的 Y*四*,并用相同的颜色着色的是为它们服务的 V 和 U 对。

与 RGB 相比,此格式(通常称为 YUV)提供了双倍的压缩。

YUV 到 RGB 转换 - 整数查找表方法

YUV 到 RGB 的转换使用简单的线性公式。

为了避免转换为浮点数,我们使用了以下众所周知的整数近似值

这些公式的中间结果大于 216,我们将在后面的向量化讨论中引用。

对于标量计算,iOnRoad 使用查找表(LUT)方法:由于 Y、U 和 V 是 8 位,上述公式中的乘法可以预先计算在五个 256 项、32 位输出的 LUT 中。

YUV 到 RGB 转换 - 使用 Intel SSE 的定点方法

Intel® SSE 没有向量化的 LUT(gather)指令。打包的 16 位乘法通常比标量 LUT 操作和后续打包的组合更快。

但是,基本的 Intel SSE 16 位乘法(PMULLW)不能使用,因为预期的中间结果大于 216

Intel® SSSE3 具有 _mm_mulhrs_epi16() 指令,该指令将全 16 位乘法与中间 32 位结果右移相结合,得到一个带有舍入的最终 16 位结果。

为了在最终结果中提供最大数量的有效位,原始乘法操作数应左移(在本例中,我们可以获得 13 位的最终结果)。

YUV 到 RGB 转换 - 定点 SSE 方法的实现

该过程首先加载两个 16x8 位 Y 部分和 8 个(U,V)8 位对。

最终,这些数据将被转换为 16x32 位的 RGB 像素(以 FRGB 格式,最高字节为 0xff)。

使用 8 位带饱和的减法操作,从 16x8 位的 Y 中减去 16,以避免检查和纠正结果是否为负。

8 对(U,V)“服务”于 16 个 Y 的 2 行。

要解包输入数据,使用字节洗牌操作,生成两个部分:

  • 2 组 8x16 位 Y
  • 1 组 4x16 位双 Y
  • 1 组 4x16 位双 V

下面是生成一部分的详细方案

在使用 U 和 V 之前,使用打包的 16 位 _mm_sub_epi16() 指令减去 128。

减法后,所有 8x16 位的 Y、U 和 V 打包数据都向左移位,以最佳方式适应 _mm_mulhrs_epi16() 指令,该指令与适当打包的系数一起使用。

注意:上述准备步骤(减法和移位)替代了标量算法中的 LUT 操作。

将乘法结果相加得到最终的 16 位打包值,使用 _mm_min_epi16() 和 _mm_max_epi16() 将其截断在 0 和 213-1(8191)之间。

所有计算完成后,结果以打包的 13/16 位分离的 R、G 和 B 值形式呈现。

将这些值重新打包成 FRGB 格式(其中 F 是一个全为 1 的 alpha 通道,这是 iOnRoad 应用所需要的)分两个阶段完成。

在第一阶段,我们将 13/16 位的分离 R、G、B 打包成 16 位的 FR 和 GB 对,使用一个额外的用 16 位 <0xff00> 值填充的寄存器。

这个重新打包阶段包括逻辑左移和右移以及逻辑 OR/AND 操作,如下图所示。

在第二阶段,FR 和 GB 中间结果使用交错的 _mm_unpacklo_epi16() 和 _mm_unpackhi_epi16() 指令最终打包成 FRGB。

上述 YUV 到 RGB 转换的基于 Intel SSE Intrinsics 的代码显示,与原始标量 LUT 方法相比,性能提高了约 4 倍

使用 Intel® Cilk™ Plus 进行并行化

智能手机和平板电脑中使用的大多数 Intel Atom 处理器至少有两个逻辑核心(目前有一些双核和超线程型号)。未来核心数量肯定会增加,因此算法的并行化只会变得越来越重要。

最简单的并行化方法由 Intel® Compiler 中的 Intel® Cilk™ Plus 扩展提供,该扩展可用于 C 和 C++ 代码(而 Intel® Threading Building Blocks 仅适用于 C++!)。

Intel Cilk Plus 最简单的并行化运算符“cilk_for”(用于 YUV 到 RGB 转换的外层循环,而不是标准的 C/C++“for”)在基于 2 核 Intel Atom 处理器 Z2760 的设备(代号为 Clover Trail)上提供了额外的 2 倍性能提升。

结合使用 Intel SSE Intrinsics 进行向量化和 Intel Cilk Plus 并行化,可提供 **8 倍** 的整体性能提升

Ω性能测试中使用的软件和工作负载可能已针对 Intel 微处理器上的性能进行了优化。性能测试(如 SYSmark* 和 MobileMark*)使用特定的计算机系统、组件、软件、操作和功能进行测量。对这些因素的任何更改都可能导致结果有所不同。您应咨询其他信息和性能测试,以全面评估您打算购买的产品,包括该产品与其他产品结合使用时的性能。配置:[基于双核 Clover Trail Atom 2.00Ghz Z2760 处理器、1GB 内存的工程样品系统,运行 Android 4.1.2 (Jelly Bean) 操作系统和特殊的 iOnRoad 测试应用程序]。更多信息请访问 http://www.intel.com/performance

结论和行动号召

Intel® SSE Intrinsics(Intel SSSE3 级别)提供了惊人的性能提升,而 Intel® Cilk™ Plus 非常适合在基于 Intel Atom 处理器的 Android 设备上并行化应用程序。

我们建议面向 Intel Atom 处理器设备的 Android 开发人员使用 Intel® SSE 和 Intel® Cilk™ Plus 来优化他们的多媒体应用程序和游戏。这些值得信赖的工具可以提供惊人的性能提升!

关于 iOnRoad

有关公司描述,请访问 iOnRoad 网站

Intel、Intel 徽标、Atom 和 Cilk 是 Intel Corporation 在美国和/或其他国家/地区的商标。
版权所有 © 2014 英特尔公司。保留所有权利。
*其他名称和品牌可能被声明为他人的财产。

© . All rights reserved.