利用英特尔® SIMD 流指令扩展和英特尔® 高级矢量扩展指令集的图像处理加速技术

内容简介


现代英特尔处理器通过使用 SIMD(单指令多数据)指令集来实现加速。SIMD 指令集包括广泛的可用英特尔® SIMD 流指令扩展(英特尔® SSE)指令集和全新的英特尔® 高级矢量扩展(英特尔® AVX)指令集。图像处理数据结果和算法通常是利用这些指令集进行优化的理想之选。与英特尔® C++ 编译器自动矢量化循环的功能结合使用时,它为提高图像处理应用的性能提供了一种高效的方法。
本文中,我们将详细介绍一些知名的转换技术,并会提供一些用于说明如何充分利用英特尔® SSE 和英特尔® AVX 转换图像数据的代码示例,同时还将介绍图像处理算法的编译器自动矢量化信息。本文详细介绍了如何优化实施(利用各种数据类型和大小)数据转换和算法以及如何分析比较性能,并为测量英特尔® SSE 优化代码和估算英特尔® AVX 优化代码提供了更快的方法。

英特尔® AVX 是一套针对英特尔® SSE 的 256 位扩展指令集,专为浮点密集型应用而设计。英特尔® AVX 将所有 16 XMM 寄存器扩展到 256 位 YMM 寄存器,使寄存器的带宽加倍,从而能够比 128 位 SIMD 指令提供更高的性能和能效。利用英特尔® AVX 还能够减少寄存器拷贝数,更加高效地使用寄存器和减少代码量。

如以下的性能加速总结所示,利用建议的技术我们能够实现更好的性能加速。


过滤器

英特尔® SSE 加速

英特尔® AVX 加速

Sepia (int base)

2.6倍

3.1倍

Sepia (float base)

1.9倍

2.2倍

Crossfade (int base)

2.7倍

3.6倍

Crossfade (float base)

1.9倍

2.4倍

以上结果系测量建议数据块大小约为 50000 像素的英特尔® 酷睿TM i7 处理器得出。注意英特尔® AVX 性能系采用模拟器估算得出,未考虑未来的架构改进。


概述


本文中提供的代码示例假设使用的是英特尔® C++ 编译器,并且需要对 SIMD、英特尔® SSE 指令内部函数 (intrinsics) 以及如何执行自动矢量化有基本的了解。编译器特性、选项和程序适合于使用英特尔® C++ 编译器 11.1.35 或支持诸如英特尔® AVX 等全新指令集的更高版本。
代码示例出自 C++ 编译器,基于 Microsoft Windows*(Vista 和 XP)进行构建和分析。

范围和假设:

  1. 图像用未压缩的 RGBA 像素值表示,其中每个色彩通道用一个整数(8 位)或一个浮点数(32 位)来表示
  2. 为了简化转换,用存储在 8 位整数或 32 位浮点数中的 0 至255 之间的数字来表示色彩值。
  3. 除非数据处理需要使用英特尔® AVX(使用 32 字节对齐),否则将数据分配给 16 个字节。

有关性能/加速的说明:

  • 由于采用英特尔® AVX 的英特尔处理器尚未上市,因此本文中利用英特尔® AVX 的函数的性能为估计值。架构模拟器(英特尔® 软件开发模拟器)和模拟器(英特尔® 架构代码分析器)用于验证行为和估算英特尔® AVX 性能
  • 实际性能取决于处理器架构、高速缓存配置和大小以及频率等。
  • 本文仅提供了有限的图像处理过滤器(算法)。性能加速是否适用于其它过滤器取决于过滤器复杂性和像素之间的相关性。不保证其它过滤器利用所述的技术也能提高性能。

下载 PDF 文档

要阅读本文的其余部分,请点击此处下载 PDF 文档(pdf 大小:1MB)

如需更全面地了解编译器优化,请参阅优化注意事项