使用SIMD(单指令流多数据流)技术来提高程序性能

背景

单指令流多数据流(英语:Single Instruction Multiple Data,縮寫:SIMD)是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术。

在微处理器中,单指令流多数据流技术则是一个控制器控制多个平行的处理微元,例如Intel的MMXSSE,以及AMD的3D Now!指令集。

图形处理器(GPU)拥有強大的并行处理能力和可程式流水线,面对单指令流多数据流時,运算能力远超传统CPU。OpenCLCUDA分別是目前最广泛使用的开源和专利通用图形处理器(GPGPU)运算語言。

SIMD,主要用于提供fine grain parallelism,即小碎数据的并行操作.比如说图像处理,图像的数据常用的数据类型是RGB565, RGBA8888, YUV422等格式,这些格式的数据特点是一个像素点的一个分量总是用小于等于8bit的数据表示的.如果使用传统的处理器做计算,虽然处理器的寄存器是32位或是64位的,处理这些数据确只能用于他们的低8位,似乎有点浪费.如果把64位寄存器拆成8个8位寄存器就能同时完成8个操作,计算效率提升了8倍.SIMD指令的初衷就是这样的,只不过后来慢慢cover的功能越来越多. 

在生活中,这种做法也很常见。例如,某作坊要做1000个面包,每个面包要经过成型、入炉、烘烤、取出等步骤。如果每次只操作一个面包,那么大多数基本动作都要重复1000次。但如果使用一个图3所示的简单模具,上面有四个“包厢(面包之厢,姑且称此名)”,那么便可以一次操作四个面包。这样一来,很多操作便都是成批的了,一次成型四个,向烤箱里放时,一次四个,拿出来时,又是一次四个,于是很多操作的重复次数便从1000次下降到了250,生产效率大大提高。

另外值得一提的是x86指令集中的SIMD指令集自发布以来并不是一成不变的,每个版本支持的指令集不同,从最早的MMX(1996年)到SSE,再到后来的AVX、AVX2等,在使用时要加以区分尽量避免混用。

 

因为能力有限,只是看到相关知识,先暂时简单了解下,以后用到在详细学习。这里先插个眼吧,有需要的同学可以学习参考文章。。 ε=ε=ε=┏(゜ロ゜;)┛

参考文章:

  1. 使用SIMD技术提高C++程序性能 https://blog.csdn.net/zhangzq86/article/details/54969005
  2. C++中使用SIMD的方法https://blog.csdn.net/Mahfaeraak/article/details/88687252
  3. SIMD指令集https://zhuanlan.zhihu.com/p/31271788
  4. SIMD(MMX/SSE/AVX)变量命名规范心得 https://www.cnblogs.com/zyl910/archive/2012/04/23/simd_var_name.html
  5. SIMD指令集发展历程表(MMX、SSE、AVX等) https://www.cnblogs.com/zyl910/archive/2012/02/26/x86_simd_table.html
  6. Intrinsics头文件与SIMD指令集、Visual Studio版本对应表 https://www.cnblogs.com/zyl910/archive/2012/04/26/md00.html
  7. 如何用gcc去编译SIMD代码:https://stackoverflow.com/questions/10366670/how-to-compile-simd-code-with-gcc
  8. X86的SIMD指令 ...simd instrucitons in X86:https://www.ibm.com/developerworks/cn/linux/l-gccsimd/index.html

发布了119 篇原创文章 · 获赞 152 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/weixin_40539125/article/details/96694123