0%

摘要

用激进的称为轨迹调度的技术编译普通的科学应用程序,我们为并行机器生成代码,其运行这些程序将会比等价的顺序机器来得快 – 我们期望是 10 到 30 倍快。

轨迹调度为称为超长指令字架构的机器生成代码。在超长指令字机器中,许多静态调度,紧密耦合,和细粒度的操作都是在单指令流里并行执行的。VLIW 是一些当前架构的并行扩展。

这些现存的架构从未突破基本的性能屏障。它们能从并行中获得的加速比从没有超过 2 到 3 倍。并不是说我们不能建造这种更高并行类型的机器;而是在轨迹调度之前,我们不知道如何为为它们生成代码。轨迹调度会在普通代码中发现足够多的并行性,从而可以证明考虑高并行度的 VLIW 是合理的。

在耶鲁,我们正在建造一个这种类型的机器。我们的机器,ELI-512,有超过 500 位的水平指令字,每个周期会执行 10 到 30 条 RISC 级别的操作 [Patterson 82]。ELI 表示极大长字指令;512 表示我们希望达成的指令字大小。(当前的设计已经有 1200 位指令字了。)

一旦清楚了我们可以为 VLIW 编译代码,一些新的问题就会出现,本文会给出这些问题的答案。我们如何在不使得机器太大的情况下,在每个周期里放入足够多的测试?我们如何在不使得机器太慢的情况下,在每个周期里放入足够多的内存依赖?

阅读全文 »

摘要

应用特定指令集处理器(ASIPs)是架构和指令集都针对特定应用领域优化过的现场或掩码可编程处理器。ASIPs 具有较高的自由度,因此越来越多地用于电信等竞争激烈的市场。但是,迄今为止,缺少适合于 ASIPs 设计和编程的 CAD 技术。在这篇文章中,提出了一种定义 ASIPs 优化微指令集的交互式方法。第二个问题是一个为预定义的ASIP 生成代码的指令选择方法。生成了一个指令集和数据路径模型的组合,在这上面映射了应用。

阅读全文 »

摘要

指令选择是代码生成中三个主要的优化问题之一 – 其它两个是指令调度和寄存器分配。指令选择器的任务是将来自目标独立表示的输入程序转换为一个特定目标的形式,期间会充分利用可以使用的机器指令。因此,指令选择是生成在特定目标机器上既正确又高效运行的代码至关重要的一部分。

尽管自 1960 年代后期以来一直在研究,但是这个领域的上一篇综合调查是写于 30 多年前的了。因为,自从它发表之后出现了许多新的方法和技术,所以需要对当前的文献进行新的审查。这个报告解决了这个需求,给出了一个广泛的调查,以及指令选者过时的方法和最新方法的分类。因此,这个报告取代和扩展了之前的调查,并且尝试着指出未来的研究方向。

阅读全文 »

简介

高级语言的大部分优化技术研究关注于改善生成的程序的执行时间,通常以增加储存为代价。当解决了存储优化之后,通常也会影响到时间类的优化,例如指令减少相关的代码转换。在 Bliss 编译器(WJWHG75) ,这样一个存储优化编译器中,也会执行降低寄存器临时存储的转换,但是没有解决程序变量自动覆盖的问题。

微型计算机和微处理器的日益普及表明,到了全面检验自动存储优化问题的时候了。因为在小型系统的环境下,缺少空间总会是一个问题,小型机器的普及意味着这个问题的重要性日益增加。虽然内存成本的下降会减缓这个趋势,但是墨菲定理的一个变体确保了程序大小的增长总是快于可用内存的增长。换句话说,程序员总是写不合适的程序,因此,随着时间的推移,他们会做得更多。

阅读全文 »

背景

为了学习了解 LLVM 的代码,从其官方仓库中下载代码,然后进行配置,生成可执行文件,便于学习代码过程中调试使用。

阅读全文 »

摘要

本篇论文给出了一大类程序间数据流-分析的问题如何在多项式时间里通过将其转换为一种特殊的图可达问题进行解决的方法。唯一的限制是数据流事件集合必须是有限集的,且数据流函数必须分布在合并操作上(并集或者交集)。这类问题包括–但不限于–经典的分离问题(也被称为“产生/去掉” 或者“位-向量”问题)–如,到达顶点,有效表达式,或者存活变量。此外,我们的技术可以处理的问题种类还包含许多非问题,包括真实存活变量,拷贝传播,和可能未初始化变量。

结果有一个初步的 C 程序(查找可能的未初始化变量)实验研究给出。

阅读全文 »

定义了两种关系,用于捕获LALR(1)向前看集计算问题的基本结构;以及给出了计算这个集合的高效算法,其是与关系大小相关的线性时间。特别的,对于一个 PASCAL 语法,这个算法的执行性能比通过通用编译器-编译器 YACC 执行这个集合单元小 15%。

当一个语法不是 LALR(1),显式给出的,关系,提供给面向用户的错误消息,其特别给出了向前看问题是怎样出现的。此外,由这些关系导致的有向图中的某些循环表明对于任意 k,这个语法不是 $LR(k)$。

最后,一个经常被发现和使用,但不正确的向前看集合算法同样基于这里第一次定义的另外两个关系。这个算法的形式化定义应该有助于防止重复发现它。

阅读全文 »

摘要

本文介绍了 PQCC(Production-Quality Compiler Compiler)项目中的一些代码生成问题[8]。采用的方法在几个方面上是独特的。代码序列选择,寄存器分配等需要的机器相关信息,已经以表格的形式,与机器无关的算法分离。这不仅极大地简化了新机器或者语言的代码生成器开发,也为从形式化机器描述如 ISP [1] 自动生成这些表铺平了道路。使用了一个类似解析树的中间程序表示,促进了表达式相关的上下文和数据依赖信息的使用。代码生成过程分成了几个阶段。这使得更简单以及能更好的理解代码生成过程,并且允许对生成代码的质量进行重大改进。讨论了初步确定寻址方式,寄存器和其它位置的分配,以及代码选择场景分析等的算法。这篇文章描述的算法已经在 PQCC 编译器中实现和使用。

阅读全文 »

如果我们可以写出能保证正确运行,且从不需要调试的程序,将是非常美好的。直到太平的那天,正常的编程周期将涉及编写程序,编译它,执行它,然后调试它的(有点)令人害怕的祸害。一直重复直到程序如预期的工作。

通过插入代码打印选定的感兴趣的变量的值是可以调试程序的。确实,在一些场景下,如调试内核驱动,这个可能是首选的方法。这存在一个低级别的调试器允许单步通过执行程序,一条一条指令的,二进制的显示寄存器和内存内容。

但是更简单的是使用一个源码级的调试器,它允许你单步程序的源码,设置断点,打印变量值,以及也许还有一些其它的功能,如在一个调试器里允许你调用你程序中的函数。问题是如何协调两个完全不同的程序,编译器和调试器,从而可以让程序变成可调试的。

阅读全文 »

简介

之前大部分的冗余消除算法都可以分为两类。词法算法处理整个程序,但是它们只能识别词法完全相同表达式的计算的冗余,这里说的表达式词法完全相同指的是,将完全相同的运算符应用于完全相同的操作数。另一方面,值标号算法,可以识别词法不同但肯定会计算相同的值的表达式间的冗余。这是通过给表达式赋一个叫值编号的特殊符号的名称来完成的。如果两个表达式的操作数的值编号完全相同,且应用于表达式的操作符完全相同,则表达式接受了相同的值编号然后一定会有相同的值。值编号的相同性允许比词法相同更广泛的优化,但是值标号过去总是限制在基本块中(没有分支的计算序列),或者扩展基本块中(没有连接的计算序列)。

阅读全文 »