因为之前的两篇博文前瞻-全时优化和LLVM-1前瞻-全时优化和LLVM-2都是基于Chris Lattner 2004年发表在CGO的文章写的。所以需要介绍一下LLVM从2004到2010这六年的变化,LLVM的开发社区很活跃。

从2004年三月到2010年4月,LLVM共发布了1.2-1.9,2.0-2.7,16个版本,至少每年发布两个版本。详细的历史发布版本和release都能从这里找到。

Continue reading »

 

概览SPEC

Standard Performance Evaluation Corporation:标准性能测试协会,一个致力于发布管理计算机性能标准化测试的组织.建立于1988年,会员包括Apple,Dell,IBM,Intel,Microsoft和Sun。Spec的测试例子被光感应用于计算机系统的性能测试中。

SPEC的测试例子是为了测试实际生活中的场景,如SPEC web2005通过并发HTTP请求测试web服务器的性能.SPEC CPU通过多个例子的运行时间长短衡量CPU的性能。SPEC的测试例子都采用平台无关代码编写,以便能使用各种编译器和平台来测试。现在的工业界更是针对SPEC中的测试例子做优化来证明编译器,CPU,web服务器等等的性能提升。

SPEC发布了以下性能测试集:

  • SPEC CPU2006/2000用来测试CPU,存储和编译器的性能
  • SPEC jms 2007,用于测试JAVA消息服务的性能
  • SPEC web 2005 用于测试PHP或者JSP的性能
  • SPEC Viewperf,用于测试OpenGL 3D图形系统的性能
  • SPEC apc,用于测试给定系统中多个3D交互应用的性能
  • SPEC OMP2001 使用OpenMP测试并行系统的性能
  • SPEC MPI2007 使用MPI测试并行系统的性能
  • SPEC JVM 2008,测试Java Runtime Environment(JAVA运行时环境,JRE)在不同客户和服务器系统上的JAVA性能
  • SPEC jAppServer2004, 测试JAVA 2 Enterprise Edition应用服务器的性能
  • SPEC jbb2005,同样测试JAVA系统的性能,但测试的是a three-tier client/server system (with emphasis on the middle tier)
  • SPEC Mail2001,测试邮件服务器的 Continue reading »
 

今天听了一个博士师兄的论文答辩,试图提高分布式存储并行和共享存储并行中,循环中并行粒度。

分布式存储下的并行,可以简单的理解为片间的并行,集群,很多CPU的计算机中的并行都属于这一类,这类并行强调的是消息传递,因为每个计算单元都有自己的存储空间,且这些存储是相互独立的,靠消息传递的方式来维护存储一致性,这类程序通常使用MPI工具做并行程序开发。这种并行一般是进程之间的并行,每个进程都有独立的资源管理和消息收发,地址空间相互独立。

共享存储下的并行则不同,采用线程间的并行策略,即并行任务之间采用共享存储空间的形式,存储和资源都是共享的。这类并行多存在于现在流行的多核和众核系统中。主要面临的问题是一致性,缓存一致性是最主要的,因为多核系统通常是每个单核有一级cache,而多个核之间又共享二级或者三级cache,据说CPU上30%多的功耗都用在了维持一致性上。片上面积也一半多用来做了cache。OPENMP就是为共享存储而生的编程工具。 Continue reading »

 

不知不觉,一个多月的时间,Fred Chow的讲义就被翻译完了。感谢那些奉献代码的人,在编译器优化上所做的努力和探索永没有止境。

感谢忍住我蹩脚的英语和汉语,看了这些翻译的朋友们。在这个翻译的过程中,深深感到自己的水平很不足,很多翻译别说雅和达,连信这个简单的要求都很难达到。争取将这些资料进一步的完善,能够给更多的人一个可靠的参考。希望大家多提意见和建议.

单就我个人,还是在翻译的过程中,学到了很多,原先都是单纯的看ppt,但是发现那样的话,印象不顾深刻,所以就决定一点点的翻译。自这个博客创建以来,一直希望能将这里搞成编译爱好者们喜欢的网站,呵呵我将继续努力。
Fred Chow是Open64的几个元老级人物之一,高屋建瓴,统观全局的讲述,让我在翻译的过程中很是佩服,只有在这样的积累下,才能讲出这么详实概括的课程。 Continue reading »

 

OpenMp和自动并行化
此文是Fred Chow在德拉华大学所讲open64课程讲义的翻译,转载请注明出处 http://www.lingcc.com
Fred Chow 原版讲义见最后一页

  • 并行化

两种在open64中获得粗粒度并行化的方法:OpenMP和自动并行化。前者使用选项-mp来指导并行化,在Fortran,C和C++中支持OpenMP2.5。后者需要选项-apo打开,功能是在LNO阶段检测并行的循环并插入指导。在同一个编译中,可以两个同时使用。

  • 对粗粒度并行化的支持

并行化的代码给出它自己函数的轮廓(?),轮廓函数嵌入到原始过程中,原始过程中的本地变量采用静态链的方式访问,指向轮廓函数的指针被传到libopenmp中的同步机制中用来做定型执行的调度。其中会有一段并行的代码保存下来以备串行执行之用

  • 并行运行时执行

通过大量产生线程来达到执行并行代码区域的效果,默认情况下的线程数是CPU的个数,libopenmp(PathScale专利)包含:线程控制和同步机制和OpenMP intrinsic相关机制.运行时的动作通过环境变量控制,如指定线程和处理器之间的亲和性 Continue reading »

 

循环嵌套优化(LNO)
此文是Fred Chow在德拉华大学所讲open64课程讲义的翻译,转载请注明出处 http://www.lingcc.com
Fred Chow 原版讲义见最后一页

  • 循环嵌套优化

循环嵌套优化(LNO)概述
该优化主要在嵌套循环上做转换。该部分工作的范围时每个顶层循环内的嵌套,优化分析过程中并不构建控制流图,而是通过数据依赖分析驱动。使用标量优化阶段(WOPT)提供的别名和使用-定义信息,并通过代码生成器将数据依赖信息附注在每个use上(仅在最内层循环),这部分优化需要对硬件资源建模。

  • 依赖测试

依赖的定义:给定两个引用R1和R2,若它们都访问同一块内存且从R1到R2有路径存在,则称R2依赖于R1,依赖分为:真依赖,反向依赖(anti dependence)和输出依赖三种。另外还要说明访问数组和向量(vector)的区别,访问数组当每个数组的下表时循环归纳变量时,访问向量时所有的向量下标都访问数组。依赖测试(输入是访问数组时),参考论文<高效精准的数据依赖分析>(Efficient and Exact Data Dependence Analysis),Dror Maydan,et al.., PLDI’91. 依赖测试的输出是依赖向量,每一维表示一个循环嵌套的层。

  • LNO实施的三类优化

数据缓存转换(?),协助其他优化的转换,向量化和并行化 Continue reading »

 

此文是Fred Chow在德拉华大学所讲open64课程讲义的翻译,转载请注明出处 http://www.lingcc.com
Fred Chow 原版讲义见最后一页

代码生成

  • 目标机信息表(targ_info)

该机制来自Cydrome,并进行了增强。将目标机指令集,ABI和调度信息参数化。通过表生成机制来编译和链接,生成的表是用于CG阶段的C++文件(?).这种机制能将优化算法和体系结构细节分开,而且再移植到新结构上时能最小化编译器的改动,因为机器相关的内容存放在机器相关的文件夹内。支持ISA子集。不同处理器的调度信息实现编译成独立的.so文件,并使用编译选项控制dlopen()使用哪个.so文件

  • 代码生成中间表示(CGIR)

这种中间表示的每个操作(op)对应一条机器指令,通过targ_info来格式化指令。在一个目标机op中操作数和结果都存放在TN中(或者寄存器符号中).TN有符号、直接量和寄存器三种类型。TN的类型都是依据指令格式制定的。每个操作都使用两个操作数,并写出一个结果(和RISC相似),某些特殊的指令也能写两个结果(如 mul) Continue reading »

 

此文是Fred Chow在德拉华大学所讲open64课程讲义的翻译,转载请注明出处 http://www.lingcc.com

Fred Chow 原版讲义见最后一页

Open64课程–过程间分析优化

  • IPA的角色

唯一在程序间的优化操作。分析:收集整个程序的信息; 优化:在程序过程之间进行优化。IPA的整个优化效果取决于它之后的优化;IPA也为之后的优化阶段提供了跨文件的信息。

 

此文是Fred Chow在德拉华大学所讲open64课程讲义的翻译,转载请注明出处 http://www.lingcc.com
Fred Chow 原版讲义见最后一页

全局标量优化II-Main-OPT

  • 三种和依赖有关的优化策略(Re-cap?)
    • 删除无用计算—死存储删除
    • 删除冗余计算—通用子表达式、循环无关代码移动、部分冗余删除
    • 计算排序—循环转换、指令调度
    • 本节将会讨论前两种
  • 部分冗余删除
    • 什么是部分冗余—执行某些路径时的冗余计算
    • 方法:在非冗余路径上插入的计算导致的完全的冗余(相对于部分冗余)
    • 这样,完全的冗余就会被删除
    • 部分冗余删除比循环无关代码外提要好

    wopt-2_html_452c7d7f Continue reading »

2009-2011© 编译点滴 Suffusion theme by Sayontan Sinha

无觅相关文章插件,快速提升流量