http://blogs.arm.com/software-enablement/871-windows-rt-app-optimization-with-neon/
利用 NEON 优化 Windows RT 应用程序
投稿人: Alan Chuang,2013 年 1 月 7 日
随着 Windows RT 的到来和 Microsoft 应用商店的开幕,你现在可以在 ARM 平台上开发 Windows 应用商店应用程序,通过 Microsoft 应用商店提供给 200 多个市场。如果你是 Android 或 ARM Linux 开发人员,或许已在使用 ARM® NEON™ 优化你的应用程序或从 NEON 优化的库中获益。实际上,你也可以使用 NEON 加速 Windows RT 应用程序。
NEON 是 ARMv7 架构中引入的广泛 SIMD 数据处理架构扩展。它执行“打包 SIMD”处理,可用于优化多媒体编解码器算法、2D/3D 图形库或其他数据处理应用程序。事实证明,许多开源项目或专利应用程序中都非常流行使用 NEON。WebM 多媒体项目和 Android 的 Skia 库就是利用 NEON 指令的软件库的不错例子。
Windows RT 也利用 NEON 进行优化。Microsoft Visual C++ 编译器利用与 ARM RCVT 编译器 4.1 相似的实施支持 NEON 本征函数。你可以通过包含 arm_neon.h 标头文件来访问 NEON 本征函数。这与你为 Linux/Android 开发所做的工作相同。详情请见 MSDN 网站。SIMD C++ Math 库 (DirectXMath.h) 是利用 NEON 本征函数实施的,可用作不错的参考。
作为示例,我决定从 Android NDK 移植 HelloNEON 程序,来了解在 Windows RT 上使用 NEON 本征函数的简易性。HelloNEON 程序具有几个优点。它比较小,而且编写良好;因此很容易理解,也可根据需要进行修改。它也同时提供了 C 和 NEON 实施;所以我能够轻松地展示 NEON 优化的优势。
结果表明,真的不需要很多工作。我要做的就是创建一个包含大量函数实施的 WinRT 组件项目,替换掉 Linux 系统调用来获得 Windows 版本的时间戳,将主要例程打包为 WinRT 组件,最后再实施基于 JavaScript 的简单 Windows 应用商店应用程序作为前端以启动测试。
重新编写时间戳函数:
Android 版本:
Windows 版本:
将主要例程打包为 WinRT 组件:
利用 JavaScript/HTML5 实施简单的 UI:
写完代码后,你必须将平台指定为“ARM”,将内部版本配置指定为“Release”。你也必须设置远程调试,以便在 Windows RT 设备上运行该程序。我是在 Surface RT 平板电脑上测试的。
结果非常好 -- 如果将结果归一化,NEON 版本的速度大约是 C 版本的两倍。
因此,无需任何硬件更改,我就能通过 NEON 优化获得比原始 C 实施高 100% 的性能。当然,结果会根据你的函数或算法的不同而有差异,但优势显而易见。还应注意的是,这是单线程实施。Surface RT 设备使用 NVIDIA® Tegra® T30 芯片,该芯片利用的是四核 ARM Cortex™-A9 MPCore CPU。如果你的函数或算法能够很好地并入独立的处理块中,多线程实施能为你提供进一步的优化。
利用 Microsoft Visual C++ 编译器中的 NEON 本征函数支持,使用 NEON 加速你的 Windows RT 应用程序就如包含相关的标头文件和编译器选项那样简单。如此多的应用程序已在从 NEON 优化中获益,你的应用程序也应该一样。如需有关 NEON 的更多信息,请访问 ARM 在线信息中心。你也可以查阅在线的 NEON 编程参考指南。
Alan Chuang 是 ARM 客户端计算工程专家,在联网、通信、嵌入式系统和 Web 技术方面拥有多年软件开发经验。他热衷于联网技术,着迷于各种网络技术改变我们生活的方式。Web 技术就是最好的例证。他目前在 ARM 的工作主要侧重于客户端计算软件生态系统,包括 Linux、Android,以及最新的 Windows RT。随着移动计算逐渐成为可预见未来的主流,他当然也希望参与到网络下一步发展的行动中。