《计算机体系结构-量化研究方法》是计算机体系结构领域,最经典的教材,同时也是最前沿的参考资料。
经典,是因为没有其他的书能超越此书在体系结构领域的地位。前沿,是因为这本书基本是每5年左右再版一次。
紧紧围绕最新的体系结构方向的变化。
这就是为什么这篇文章虽然是在对比《量化》第4版和第5版的区别,却胆敢标题里加上“体系结构这五年”。
《量化》第5版是前天在国内市场正式上市的,《编译点滴》在第一时间拨出巨款购入此书。
就是希望能为各位朋友送上更有价值的博文。
《计算机体系结构-量化研究方法》是计算机体系结构领域,最经典的教材,同时也是最前沿的参考资料。
经典,是因为没有其他的书能超越此书在体系结构领域的地位。前沿,是因为这本书基本是每5年左右再版一次。
紧紧围绕最新的体系结构方向的变化。
这就是为什么这篇文章虽然是在对比《量化》第4版和第5版的区别,却胆敢标题里加上“体系结构这五年”。
《量化》第5版是前天在国内市场正式上市的,《编译点滴》在第一时间拨出巨款购入此书。
就是希望能为各位朋友送上更有价值的博文。
GIMPLE中间表示,是GCC中机器无关的中间表示,机器无关的优化基本都在这个层次上做。
本文先来看看GCC是如何进、出GIMPLE中间表示的。 Continue reading »
最近调程序,出现illegal instruction问题,没有头绪。 索性把illegal instruction好好窥探一下。 Continue reading »
Stencil codes are a lass of iterative kernels which update array elements according to some fixed patten. They are commonly used in computer simulations , like computational fluid dynamics in the context of scientific and engineering application, solving partial differential equations, Jacobi kernel, Gauss-Seidel method, image processing and cellular automata.
Stencil codes usually perform a sequence of sweeps through a given 2- or 3- dimensional array. In addition to their importance in scientific calculations, stencils are interesting as an architectural evaluation benchmark because they have abundant parallelism and low computational intensity, offering a mixture of opportunities for on-chip parallelism and challenges for associated memory systems.
事务内存(Transaction Memory)是最近几年非常火热的研究方向之一.如果成功,IBM将是首个引入该支持的.IBM是在HotChip 2011上宣布这一消息的.支持事务内存的芯片PowerPC A2将用来攒BlueGene/Q,一款将在2012年完工的IBM超级计算机.Sun曾在一款已经流产的芯片(Rock) 中实现了该技术.曾经参与此项发言的工程师表示,对于某些特定的应用,事务内存能带来很大的好处,但对其他应用基本没有什么作用. Continue reading »
Almost all the Modern compilers have auto-vectorization support to help programmers make full use of the SIMD extensions of generic CPUs. For example, GCC, Intel Compiler, Open64/Pathscale. However, it is hard for compiler to do vectorization that is correct and have speedup. This post is about how to write code that is easy to vectorization.
精确的数据流分析是让编译优化能高效进行的基础。 SSA就是一种高效的数据流分析技术,目前几乎所有的现代编译器,如GCC、Open64、LLVM都有将SSA技术的支持, 不仅仅是编译器,Jikes RVM, HotSpot JVM, .Net的Mono,Python的Pypy, Andoroid的Dalvik,这些虚拟机/解释器中的Just-in-Time Compiler也有了SSA的支持。 Firefox的下一代JavaScript引擎IonMonkey中,也将为其JIT引入SSA。 Continue reading »
在Intel Sandy Bridge微架构中,Intel引入了256位SIMD扩展AVX,这套指令集在兼容原MMX、SSE、SSE2对128位整点SIMD支持的基础上,把支持的总向量数据宽度扩展成了256位。新增了若干条256位浮点SIMD指令。
昨天,Intel刚刚发布了AVX2指令集,这套指令集在AVX基础上做了扩展,不过要在2013年发布的Haswell处理器上才能支持。参考1给出了AVX2的详细特性。
目前,包含SIMD支持的体系结构主要分为如下几类:
对称多核处理器厂商的典型代表是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的访存能力就大大增强。
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 所示:
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扩展的通用微处理器能得到通用计算市场领域的认可,是因为向量机的内存、缓存和处理器设计及实现成本过高。 06年,只要1000多美元就能买到一台CPU频率比造价上千万的向量机还要高的笔记本电脑。 不过,因为向量机自身有通用串行微处理器很难企及的优势,在对存储带宽要求较高的科学和工程应用中仍然很流行。 这使得向量机在高性能计算领域,牢牢的占据着一席之地,在2010年11月全球高性能计算机的TOP10中,仍有4个是向量机。
Davida A. PaDua和Michael J. Wolfe总结了针对向量和多核计算机的编译器应该具有的特性。 他指出数据依赖分析,尤其是针对循环的数据依赖分析是自动向量化编译器必须具备的功能,而并行化则是多核计算机性能提升的关键。
传统向量机的向量化技术多数针对基于数组的FORTRAN语言,而现阶段很多数据并行度高的多媒体应用都是用C语言编写。 C语言中的指针和其他语言特性使得针对向量机的向量化技术很难直接应用在通用处理器的SIMD扩展中。
参考文献:
自计算机诞生之日起, 性能一直是计算机技术发展的主线之一。 计算机的计算过程本质上是使用一个指令序列处理一个数据集合最终产生结果的过程。 Flynn根据指令和数据的对应关系将计算方式分为如表 1.1 所示的四类。
| 单指令(Single Instruction) | 多指令(Multiple Instruction) | |
| 单数据(Single Data) | SISD | MISD |
| 多数据(Multiple Data) | SIMD | MIMD |
SIMD技术是许多计算密集应用提升性能的关键。 上世纪80年代,向量处理器以其出色的并行处理能力,曾经在高性能计算领域广泛应用。 这种并行处理能力就来自SIMD技术。
近几年,由GPGPU和通用CPU组成的异构模式也在高性能计算领域大显身手。 GPGPU的SIMT模式,因为一次将一条指令作用于一个线程块中多个线程中的数据,因此本质上也是SIMD。 因为SIMT的计算模式使得多个线程可以并行执行,因此并行密度高。
在通用计算领域,随着数字多媒体技术的发展。 使用通用计算机对诸如文本、图像、视频、二维和三维图形之类的多媒体对象做捕捉、编辑、存储和转换之类的应用越来越多。 这类应用的突出特点是数据宽度小、并行度高、计算相对整齐。 本世纪初,许多通用微处理器针对这类应用的特点,开发了SIMD指令集扩展。
这种扩展中SIMD指令操作的数据集合都保存在一个寄存器中。 所以这种SIMD也被称作SWAR(SIMD Within A Register)。 其中的数据集合被称为SIMD数据或向量。 由于本文的工作基于通用CPU中的SIMD扩展,为了表述方便,如无特殊说明,文中的SIMD都指SWAR。
这种扩展仅使用芯片上少量的晶体管,就可以为标量CPU引入SIMD支持,提升芯片数据并行处理能力,所以得到了许多通用CPU厂商的亲睐。 表 2 为从惠普公司最早在通用CPU中引入SIMD指令至今,主流通用CPU中引入SIMD扩展的情况。 从表中可以看出,各个厂商推出的SIMD指令集从最初的仅仅支持整点操作发展到现在支持有符号/无符号整点、单精度和双精度浮点,支持的数据类型越来越丰富; 从开始时复用浮点寄存器到现在有专门的向量寄存器,SIMD指令越来越多,向量运算的支持越来越强大; 从开始时,仅支持64位向量数据,到现在可以支持256位的宽向量数据类型,支持的向量越来越宽。
| 供应商 | SIMD扩展名称 | 年份 | 扩展指令 | 寄存器情况 |
| HP | MAX-1, MAX-2 | 94,95 | 9,8(int) | INT 32x64b |
| SUN | VIS | 95 | 121(int) | FP 32x64b |
| INTEL | MMX | 97 | 57(int) | FP 8x64b |
| IBM | AltiVec | 98 | 162(int, fp) | INT/FP 32x128b |
| Intel | SSE | 98 | 70(fp) | INT/FP 8x128b |
| MIPS | MIPS-3D | 98 | 23(fp) | FP 8x64b |
| AMD | 3DNow! | 99-10 | 45(fp) | INT/FP 8x128b |
| Intel | SSE2 | 01 | 144(int,fp) | INT/FP 8x128b |
| Intel | SSE3 | 04 | 13(fp) | INT/FP 8x128b |
| ARM | NEON | 04 | 119(int,fp) | INT/FP 32×64,16x128b |
| Intel | SSSE3 | 05 | 32(int) | INT/FP 8x128b |
| Intel | SSE4 | 06 | 54(int,fp) | INT/FP 8x128b |
| 龙芯2E | MMI | 06 | 58(int) | FP 32x64b |
| Intel, AMD | AVX | 08 | 12(fp) | INT/FP 16x256b |
| 龙芯3A | MMI扩展 | 08 | 25(fp) | FP 32x64b |
| 2009-2011© 编译点滴 | Suffusion theme by Sayontan Sinha |
近期评论