上篇文章前瞻-主流处理器中的数据并行支持(SIMD)》 介绍了当今主流CPU中的SIMD扩展,本文将介绍前人是物和利用SIMD来做优化的,下篇<前瞻-拿起SIMD的武器II>将探讨如何使用CPU的向量指令为程序做优化

已有在SIMD上的优化工作:

正如之前提到的,SIMD对具有以下特性的程序性能提升明显:天然数据并行,访存模式重复、在局部数据上重复操作、控制流数据无关。很多应用有这方面的特性,并能通过使用SIMD扩展提高性能,但实际仅有小部分从中获益,接下来将介绍在单核处理器上,利用Intel的SIMD扩展针对某些应用提升性能的研究,如多媒体,数据安全,数据库和一些科学计算应用。

多媒体处理

多媒体处理需要软件和硬件的很多支持。如MPEG-1,MPEG-2,MPEG-4,MPEG-7,H.263,JPEG2000等需要实时做复杂的媒体处理.3D图像和立体视频处理都需要更强劲的实时处理.因为各种媒体都需要不同的处理方式,技术支持、算法和硬件,因此针对他们的SIMD扩展改进也很不同。 Continue reading »

 

LLVM2.7已经发布好几天了。今天尝试一下:)

1,下载相关源码包:

wget -c http://llvm.org/releases/2.7/llvm-2.7.tgz
wget -c http://llvm.org/releases/2.7/clang-2.7.tgz
wget -c http://llvm.org/releases/2.7/llvm-gcc-4.2-2.7.source.tgz
wget -c http://llvm.org/releases/2.7/llvm-test-2.7.tgz

llvm-2.7.tgz是LLVM的主要源码包,clang-2.7.tgz:Clang前端,llvm-gcc-4.2-2.7.source.tgz:GCC4.2前端,llvm-test-2.7.tgz:LLVM 测试验证包。
Continue reading »

 

2010年美国高校计算机系排行榜出炉–《U.S. News》公布了新一期美国大学计算机系实力排名。前四:卡内基-梅隆大学(CMU)、麻省理工学院(MIT)、斯坦福大学(Stanford U)和加州大学伯克利分校(UC Berkely).

前四名具体排名


Continue reading »

 

strace- system calls and signals trace.跟踪系统中调用和信号信息。
最简单的情况下,strace ls 会执行ls命令直到结束,监听记录ls进程执行过程中的系统调用信息和进程接收的信号,每个系统调用的名字、参数和返回值都打印到标准输出,也可以使用-o选项输出到文件。strace是很有用的调试工具,对于源码不可见的程序,非常有用,因为系统调用和信号是用户态和内核态之间交互的接口,strace将有助于程序员定位bug,
如下,为在博主电脑上运行 Continue reading »

 

1,因为代码是从svn库里先checkout出来的,为了方面使用mercurial,就先做了清理工作。
删除当前目录下的所有.svn文件夹
find . -name “.svn” -type d -exec rm -rfv ‘{}’ \;
. 当前目录下
-name “.svn” 文件/文件夹名称为.svn
-type d 文件类型为文件夹
-exec 执行之后的命令直到 \;
rm -rfv ‘{}’ 删除find命令找到的所有文件夹 , ‘{}’表示使用find的输出做为rm的输入
Continue reading »

 

工作如果是和编译器相关的或者编译器爱好者们,谁没有点冲动想自己写个编译器出来。我也做了一些调研,分享如下:

–介绍如何使用JAVA语言完成一个面向LLVM后端的编译器,以mjava作为目标语言,这是JAVA语言的一个子集。包括词法分析,语法分析,错误控制,符号表管理,类型检查等部分

–采用一种逐步增加功能的方式构造编译器,作者的文章写的很深入前出(我只看了abstract和introduction部分)

–作者从1988-1995年用了7年的时间完成了这份介绍。没有使用flex和yacc这些东西,纯手工制作。使用pascal语言写出的编译器。是一位学物理的博士,很是钦佩!

MIT OCW 6.035 Computer Language EngineeringMIT关于计算机工程的开放课程,使用JAVA语言创建一个完整的Decaf语言编译器。我也曾看过一点,但这门课的实验要求有MIT的环境,还有一些库什么的。外面的人拿不到,所以没办法,只能作参考了。

–编译器课程,使用C++实现一个Cool(Classroom Object-Oriented Language)语言编译器.也是因为没有缓环境和库,只能作罢。

– 很有特色的一门课,也是使用C++实现COOL语言的编译器,但将LLVM融入进来,前端输出中间表示到LLVM,在作一些后端的实验。另外UIUC还有一门高级的编译器课程,是使用JAVA语言来编写。重要的是这个CS426 能够下到所有课程的资料,包括源码。 感兴趣的朋友可以试试。

– 这个系列的文章主张使用现有的工具体验如何实现编译器。注重快速高效的实现,主要关注前端。有兴趣了解和学习LLVM 中间表示和工作机制的朋友不要错过。

还有如下的参考资料(¶ Link to a PDF, $ Link to a printed book):

两个新闻组,可以上去请教问题:

想起某人在饭桌上曾经的感慨,I have a dream…..
一直以来,都觉得编译器高深莫测。做个编译器出来,或许很难,但做了可能就不能。 可能是勇气不足。再等等吧,总有一天我要把它实现!。。。。。。。

 

此文是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 原版讲义见最后一页

全局标量优化II-Main-OPT

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

    wopt-2_html_452c7d7f Continue reading »

 

全局标量优化(WOPT)一–Pre-OPT part 1

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

Fred Chow 原版讲义见最后一页

  • SSA中的zero version
    • 目的:在尽量不影响优化效果的前提下降低SSA表示的代价
      • 放弃完整的带MayDefs的使用-定义链表示。
        使用特定的version-Zero Version:标记不完整的使用-定义信息,不要将其对应到单赋值中的属性
    1. 方法:

      SSA和非SSA的version能够共存
     

    SpiderMonkey is the JavaScript VM embedded in Mozilla firefox . TraceMonkey is a  scheme in SpiderMonkey to turn some JavaScript hot code to native instructions in order to make it run fast. It was been developed by Andreas Gal etc in mozilla and the paper about it was published on PLDI,2009. The paper was named :Trace-based Just-in-Time Type Specialization for Dynamic Languages.

    TraceMonkey simply identifies loop back edges and do the optimization only on loops.  every loop back edge is a potential trace point.The loop becomes hot on its second iteration,so TraceMonkey records the code along the trace in a low-level compiler intermediate representation LIR(In Nanojit, LIR is the source language for compilation to machine code. LIR stands for low-level intermediate representation.) .TraceMonkey stops recording when execution returns to the loop header or exits the loop.After recording is finished,TraceMonkey compiles the trace to native code using the recorded type information for optimization.These code can be entered if the interpreter PC and the types of values match those observed when trace recording was started. Continue reading »

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

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