图7列出了使用SIMD技术的多种方法,我们先按从上至下的顺序简要介绍每一种,然后重点介绍汇编语言方法。
图7 使用SIMD技术的多种方法
第一种方法是使用著名的IPP库,IPP的全称是Intel Integrated Performance Primitives, 是英特尔公司开发的一套跨平台软件函数库,提供了非常广泛的功能,包括各种常用的图形图像、音视频处理函数。因为其中的很多函数都已经使用SIMD技术做了优化,所以使用这个库是使用SIMD技术的一个快捷途径。通过链接https://software.intel.com/en-us/intel-ipp/ 可以访问IPP的官方介绍,了解更多信息。
第二种方法是使用编译器的自动向量化(Auto-vectorization)支持。比如图8是在Visual Studio(C++)中通过项目属性对话框启用自动向量化的截图。
图8 在Visual Studio中启用自动向量化支持
经笔者分析,这样启用后编译好的程序中确实使用了一些SIMD指令,比如图9右侧蓝色加亮那一行使用的便是SSE2中的cvtsi2sd指令,它可以将源操作数中的有符号双字整数转换成目标操作数中的双精度浮点值。
图9 观察编译器自动向量化产生的SIMD指令
如果使用GCC编译器,那么可以使用类似这样的命令行来编译:
代码1
如果希望看到编译器所采取的向量化动作,那么可以增加-ftree-vectorizer-verbose=1,于是可以类似图10的输出信息。
图10 使用GCC的自动向量化支持
使用GDB的反汇编功能,可以很容易地观察到GCC产生的SIMD指令,如图11所示。</