DSP

[SIMD]单指令多数据指令集(一)——SIMD简介

2019-07-13 17:09发布

SIMD简介        关于SIMD,百度上一搜一大堆(MMX/SSE/AVX/3DNow/NEON),我就不再浪费版面。这里想和大家分享的是一些自己的心得体会,之后会陆续提供一些自己做的例程,是分享,也算是一种总结。        主流的几个CPU架构都有推出自己的SIMD指令集,X86的MMX/SSE/AVX,ARM Cortex-的NEON,MIPS架构的X-Burst。SIMD指令集最直接的是可以大幅提高多媒体应用的性能,比如图像里的像素点,可以用SIMD指令集一次性计算N个8-bit像素点;比如音频数据中大量的浮点运算,也可以一次性计算N个音频采样值。SIMD指令集的设计目标就是为了提高多媒体应用的性能。随着芯片工艺的不断发展,摩尔定律将会逐步失效。在可以预见的未来,并行计算是未来提高芯片处理性能的大方向,多线程主要完成任务并行,SIMD技术则主要完成数据并行。这里要补充一点的是,类似于北京君正,所推出的xburst也有基于SIMD的指令集,出于某种原因,这类芯片厂商目前还对他们的SIMD指令集加以保护,并未公开。        最早接触SIMD指令集是在2008年的时候学习x264的时候,x264里主要用的是SSE2.2,针对宏块、子块的DCT变化、SAD、运动搜索、熵编码、运动补偿、帧内预测、帧间预测等。那时对SIMD指令集有了初步的认识,因为图像数据的像素点都是8bit的数值,原本用一个32bit寄存器一次计算一个值就够浪费了,所以一经SSE的优化,性能提高还是很客观的。不过之后的很长时间X86架构下的x264没有什么新的进展,一是因为x264已经优化到了一定地步,也不见SSE推出一些新的更加匹配的指令集,另一方面265已经出来了,有识之士肯定会把精力话到新标准上。在2010年接触到了基于SSE指令集的数学库,因为兴趣,也做了一些学习研究;后来又接触到了基于ARM的NEON指令集,仍然是在学习学习学习。        一直到参加工作后(我所在的行业是信息安全领域),才开始自己动手对一些算法进行SIMD指令集的改造,个人觉得这项工作还是非常有意思的。