随着应用程序对性能的要求越来越高,硬件厂商们也在持续不断在各个方面改进硬件支持。 SIMD技术作为一种简单高效的并行技术,仅仅通过少量的结构变化,即可获得并行能力。 而且这种方式不会像Cache、分支预测之类带来很多的功耗。 Krste Asanovic等人在针对并行计算前景的调研中, 将SIMD处理和深度适中流水线(5-9级)、浮点处理单元视为未来多核和众核处理器的每个core的重要功能部件。
目前,包含SIMD支持的体系结构主要分为如下几类:
- 单核通用微处理器中的SIMD扩展: 这是最普通的一类SIMD扩展。
- 对称多核中的SIMD扩展: 结构上一般都采用多个单核通用微处理器组合形成多核,SIMD多数存在于单个核内。 这种方式,从05年发展至今,已经普遍存在于通用计算领域,如高端嵌入式、PC、低端服务器。
- 异构多核中的SIMD扩展: 一般异构多核由一个功能强大的核加若干结构简单,但计算能力强的核组成,以IBM 05年推出的Cell处理器最为典型。
- 数字信号处理芯片(DSP)中的SIMD: 相比通用芯片的SIMD扩展,DSP芯片的SIMD指令集一般是为了处理特定的数据结构,如声音、视频。 DSP中SIMD操作对象一般都通过DMA从宿主机上先拷贝到暂存器(Scratchpad RAM)中,再在这块存储上作操作。 这些指令一般不能直接访问宿主的主存。
- GPU中的SIMD: 严格意义上,GPU就是一种的DSP。 GPU以NVIDIA的CUDA最为典型,Intel也在08年展示了自己的GPU设计。 这类SIMD的突出特点是支持向量宽,SIMD指令支持丰富,计算功能强大,有SIMT支持。 但由于GPU一般都有自己的独立存储空间,且底层差异很大,所以可编程性差。
- 向量机中的SIMD: 这类SIMD在上世纪80年代红极一时,支持的向量操作最为灵活,至今仍在某些领域占据一席之地。
对称多核处理器厂商的典型代表是Intel、AMD和IBM Power。Intel自2004年发布第一款双核处理器Celeron D开始, 一直在其处理器中持续改进SIMD扩展。
2008年推出的Core i7处理器增加了对XML处理的SIMD加速支持,将非对齐访存的延迟减小到最快仅1拍, 当数据不在同一个cache line时才需要4.5拍。
Intel 2010年底推出的Sandy Bridge架构,其中的AVX扩展,除了兼容之前的MMX,SSE,SSE2外,将浮点SIMD运算支持的数据宽度提升到了256位。 并对访存通道做了调整,扩展原X86的存地址访存通道,使之也可以从内存取数据。 这样CPU的访存能力就大大增强。

Figure 2.1: AMD Bulldozer结构
AMD在2011的ISSCC上也推出了其最新双核架构Bulldozer。 图 2.1 为Bulldozer的结构图,Bulldozer的两个核不仅共享取指、解码和L2 Cache,还共享SIMD运算部件FMAC。 当执行128位的SSE2 SIMD扩展时,Bulldozer的每个核可以最多使用两套SIMD运算部件;当执行256位 AVX指令时,两个128位的FMAC部件共同执行此指令。
异构多核与SIMD的典型芯片是Sony、IBM和Toshiba共同开发的Cell处理器,其内部结构如图 2.2 所示:

Figure 2.2:Cell处理器结构

Figure 2.3:Cell处理器编译流程图
Cell处理器中包含了一个功能强大的Power处理器核PPE和八个流处理器核SPE。 SPE和PPE都有128位的SIMD数据支持,支持浮点和整点的SIMD操作。 每个SPE都有自己的局部存储,而且能够确保在一定延时内完成数据分发,这使得Cell可以用简单的逻辑完成流水线控制。 Cell需要程序员自己通过控制DMA(Direct Memory Access)部件管理数据存取。
Alexandre E. E.等人开发了针对CELL的优化编译器。 作者的工作除了构建一个面向CELL的高性能编译器外,还着力于提升结构简单的流处理核——SPE的性能,为SIMD提供自动向量化支持。但这种异构结构也为二进制兼容带来了问题,如图2.3为Cell上可执行文件编译链接流程图。
GPGPU,即将GPU用于通用计算领域,许多计算密集型应用能通过GPU的流处理支持获得较高的加速比,因为GPU有强大的数据并行能力。 每个GPU都有多个multiprocessor组成,每个multiprocessor又包含若干个processor。 每个multiprocess中的所有processor共享一个取指部件,它们同时执行一条指令,操作的数据对象可能不同。 因为GPGPU中的SIMD是每条指令同时操作多个线程中的数据,因此这种SIMD也被成为SIMT。
Rajesh Bordawekar等人使用通用CPU上SIMD + 多核优化一个实际的图像处理应用程序,证实优化后的性能可以超过GPU。 作者通过分析,得出GPU在擅长的浮点运算上不敌CPU的原因有四点: 1,共享内存小; 2,内存访问模式为非对齐; 3,原子操作代价高; 4,单线程性能弱。
Intel 08年公布了其基于X86架构的GPU设计——Larrabee[。 Larrabee采用对称众核设计,每个核都是顺序发射、X86架构,有512位宽SIMD支持,且支持函数调用栈和缺页中断处理。 但09年底Intel宣布不再将Larrabee作为GPU产品开发,而仅仅作为实验性的软件平台。 因为其能效不高,很多依赖GPU硬件实现的操作,改用软件实现,效率和功耗都不理想。
目前SIMD的发展朝着数据越来越宽,支持操作越来越复杂,访存支持越来越丰富的方向发展。 按照这个势头,SIMD扩展是否会最终变成曾经红极一时的向量机呢? 我们有必要将SIMD扩展和向量机做个对比,借鉴向量机的成功经验,同时规避向量机的劣势。
向量机是80年代和90年代初大多数超级计算机的基础,面向向量机的自动向量化研究工作在这期间也一度非常热。 向量机中又以向量——寄存器类处理器类型最为主流。 这类处理器中SIMD指令的操作数,除访存操作外,都保存在寄存器中。 通用微处理器上的SIMD扩展和这种向量处理器有许多相似之处。 如向量机中的寄存器类似微处理器上的SIMD寄存器;向量机上向量指令的功能也和SIMD指令功能相似。 但也有很多关键的不同点:
- 向量机支持的向量数据类型很长,而且支持变长向量数据;而SIMD扩展一般支持较短的定长向量数据类型。
- 向量机访存支持强大,访存带宽大;而SIMD扩展访存由于成本原因,访存支持较弱,访存带宽小。 向量机的访存部件都支持跨距访存,即可以从不连续的地址取数到一个向量里,而SIMD扩展目前仅支持连续的存取一个向量中的元素。 带宽方面,06年最快的通用超标量微处理器的访存带宽只有5GB/秒,而最快的向量处理机达到50GB/秒。
- 向量机的向量操作通用性强。 所有的操作可以针对所有的向量数据类型实施。 而SIMD扩展的向量操作由于向量运算部件物理实现的原因,限制较多,操作不通用。某些操作仅仅支持某些向量数据类型。
虽然从这些不同点来看,向量机比SIMD扩展有很大优势, 但之所以有SIMD扩展的通用微处理器能得到通用计算市场领域的认可,是因为向量机的内存、缓存和处理器设计及实现成本过高。 06年,只要1000多美元就能买到一台CPU频率比造价上千万的向量机还要高的笔记本电脑。 不过,因为向量机自身有通用串行微处理器很难企及的优势,在对存储带宽要求较高的科学和工程应用中仍然很流行。 这使得向量机在高性能计算领域,牢牢的占据着一席之地,在2010年11月全球高性能计算机的TOP10中,仍有4个是向量机。
Davida A. PaDua和Michael J. Wolfe总结了针对向量和多核计算机的编译器应该具有的特性。 他指出数据依赖分析,尤其是针对循环的数据依赖分析是自动向量化编译器必须具备的功能,而并行化则是多核计算机性能提升的关键。
传统向量机的向量化技术多数针对基于数组的FORTRAN语言,而现阶段很多数据并行度高的多媒体应用都是用C语言编写。 C语言中的指针和其他语言特性使得针对向量机的向量化技术很难直接应用在通用处理器的SIMD扩展中。
参考文献:
Asanovic et al.(2006)
ASANOVIC K, BODIK R, CATANZARO B C, et al. The Landscape of Parallel Computing Research: A View from Berkeley: EECS Department, University of California, Berkeley, 2006:21-23
D. Pham and M. N. Day(2005)
D PHAM M B, S ASANO, M N DAY E. The Design and Implementation of a First-Generation CELL Processor. IEEE International Solid-State Circuits Conference (ISSCC’05), 2005:184-592
Seiler et al.(2008)
SEILER L, CARMEAN D, SPRANGLE E, et al. Larrabee: a many-core x86 architecture for visual computing. ACM SIGGRAPH 2008 papers, 2008:18:1-18:15
Torres()
TORRES G. Inside the Intel Sandy Bridge Microarchitecture, 2010. http://www.hardwaresecrets.com/article/Inside-the-Intel-Sandy-Bridge-Microarchitecture/1161/1.
Walrath()
WALRATH J. Bulldozer at ISSCC 2011 – The Future of AMD Processors, 2011. http://www.pcper.com/reviews/Processors/Bulldozer-ISSCC-2011-Future-AMD-Processors.
Eichenberger et al.(2005)
EICHENBERGER A E, O’BRIEN K, O’BRIEN K, et al. Optimizing Compiler for the CELL Processor. Proceedings of the 14th International Conference on Parallel Architectures and Compilation Techniques, 2005:161-172
Wu et al.(2005)a
WU P, EICHENBERGER A E, WANG A. Efficient SIMD Code Generation for Runtime Alignment and Length Conversion. Proceedings of the international symposium on Code generation and optimization, 2005:153-164
Wu et al.(2005)b
WU P, EICHENBERGER A E, WANG A, et al. An integrated simdization framework using virtual vectors. Proceedings of the 19th annual international conference on Supercomputing, 2005:169-178
Eichenberger et al.(2004)a
EICHENBERGER A E, WU P, O’BRIEN K. Vectorization for SIMD architectures with alignment constraints. Proceedings of the ACM SIGPLAN 2004 conference on Programming language design and implementation, 2004:82-93
刘雷(2010)
刘雷. CUDA平台上的UPC语言扩展与优化.中国科学院计算技术研究所, 2010:1-3. 硕士学位论文.
Bordawekar et al.(2010)
BORDAWEKAR R, BONDHUGULA U, RAO R. Believe it or not!: mult-core CPUs can match GPU performance for a FLOP-intensive application!. Proceedings of the 19th international conference on Parallel architectures and compilation techniques, 2010:537-538
维基百科()
维基百科. Intel Larrabee. http://zh.wikipedia.org/wiki/IntelLarrabee
Ren et al.(2003)
REN G, WU P, PADUA D. A Preliminary Study on the Vectorization of Multimedia Applications for Multimedia Extensions. In 16th International Workshop of Languages and Compilers for Parallel Computing, 2003:420-435.
Hennessy and Patterson(2003)
HENNESSY J, PATTERSON D. Computer Architecture – A Quantitative Approach. 4th., 2003:F45-F46
TOP500.org()
TOP500ORG. November 2010 | TOP500 Supercomputing Sites. http://www.top500.org/lists/2010/11.
Padua and Wolfe(1986)
PADUA D A, WOLFE M J. Advanced compiler optimizations for supercomputers. Commun. ACM, 1986, 29:1184-1201.
Naishlos(2004)
NAISHLOS D. Autovectorization in GCC. GCC Developers’ Summit, 2004:105-118
Allen and Johnson(1988)
ALLEN R, JOHNSON S. Compiling C for vectorization, parallelization, and inline expansion. Proceedings of the ACM SIGPLAN 1988 conference on Programming Language design and Implementation, 1988:241-249
近期评论