机器无关优化之常量传播

所有根据流模式实际上都是具有有限高度的可分配框架的简单例子。这样,迭代算法的前向或逆向版本可以用来解决这些问题,并求出每个问题的MOP解。我们将深人研究一个具有更多有趣性质的有用的数据流框架。

回忆一下常量传播(或者说“常量折叠”),即把那些在每次运行时总是得到相同常量值的表达式替换为该常量值。下面描述的常量传播框架和至今已经讨论的数据流问题都有所不同。不同之处在于:

1)它的可能数据流值的集合是无界的。即使对于一个确定的流图也是如此。

2)它不是可分配的。

指令级并行性

如果一个程序中的所有运算之间都是高度依赖的,那么再多的硬件或采用并行化技术都无法使这个程序快速并行执行。关于并行化的限制方面已经有了很多研究。典型的非数值应用有很多固有的依赖性。比如,这些程序具有很多依赖于数据的分支,使得哪怕预测一下下面将执行哪条指令都变得很困难,更不要说去决定哪些运算可以并行执行了。因此,这个领域中的研究工作集中在放松调度约束的技术,包括引人新的体系结构特性,而不是调度技术本身。
每一个现代高性能处理器都能够在一个时钟周期内执行多条指令。在一个具有指令级并行机制的处理器上一个程序能够以多快的速度运行?这可是一个“价值十亿美元的问题”。对这个问题的回答要考虑下列因素:

代码调度约束

这些调度约束保证了优化后的程序和原程序生成同样的结果。但是,因为代码调度改变了运算执行的顺序,所以优化后的程序执行时某一点上的内存状态可能和顺序执行时任一点上的内存状态都不匹配。如果一个程序的执行因异常或用户设定的断点而中断时,就会产生问题。因此经过优化的程序比较难以调试。请注意,这个问题不是代码调度专有的,所有的优化技术都会出现这个问题,包括部分冗余消除和寄存器分配。
代码调度是程序优化的一种形式,它应用于由代码生成器生成的机器代码。代码调度要遵守下面三种约束:

1)控制依赖约束。所有在原程序中执行的运算都必须在优化后的程序中执行。

寄存器使用和并行性之间的折衷与代码调度阶段之间的顺序

我们将假设源程序的机器无关中间表示形式使用了无限多个伪寄存器(pseudoregister)。 这些伪寄存器代表了可以分配到寄存器的变量。这些变量包括源程序中不能通过任何其他名字访问的标量,也包括由编译器生成的用于存放表达式的部分结果的临时变量。和内存位置不同,寄存器的命名是唯一的。因此可以很容易地为寄存器访问生成精确的数据依赖约束。

在中间表示形式中使用的无限多个伪寄存器最终必须被映射到在目标机器上可用的少量物理寄存器。把几个伪寄存器映射为同一个物理寄存器有一个副作用。这种映射会生成人为的存储依赖,这限制了指令级的并行性。反过来,并行执行指令产生了更多的存储需求,以便存放同时计算出来的值。因此,尽量降低寄存器使用数量的目标和最大化指令级并行性的目标直接冲突。

更新数据依赖关系

代码移动可能会改变运算之间的数据依赖关系。因此在每次代码移动之后都必须更新数据依赖关系。

对x的两个赋值 之一可以被向上移动到顶部的基本块,因为这样的转换保持了原程序中的所有依赖关系。但是,一但我们把其中一个赋值语句上移,就不能再移动另一个。更明确地说,我们看到在代码移动之前顶部的基本块的出口处X是不活跃的,但是在移动之后就变得活跃了。如果一个变量在一个程序点上活跃,那么我们不能把对该变量的投机性定值移动到该程序点的前面。

全局调度算法

我们看到代码移动对某些路径有益,但是会损害另外一些路径的性能。好消息是指令并不是生而平等的。实际上,我们知道,一个程序的90%以上的执行时间被花在不到10%的代码上。因此,我们可以把目标确定为使得频繁执行的路径更快运行,虽然有可能降低不频繁路径的运行速度。

Flash文件系统的建立

由于无法重复地在Flash的同一块存储位置做写入操作(必须事先擦除该块后才能再写入),因此 一般在硬盘上使用的文件系统,如FAT16、FAT32、 NTFS、Ext2等将无法直接用在Flash上,为了沿用 这些文件系统,则必须透过一层转换层(Translation Layer)来将逻辑块地址(Logical Block Address)对 应到Flash存储器的物理位置,使系统能把Flash当作普通的硬盘一样处理,我们称这层为FTL (Flash Translation Layer)。FTL 应用于NOR Flash.而 NFTL则应用于NAND Flash。

YAFFS嵌入式文件系统

YAFFS文件系统有些类似于JFFS/JFFS2文件系统,与之不同的是JFFS1/2文件系统最初是针对NOR Flash的应用场合设计的,而NOR Flash和NAND Flash本质上有较大的区别,所以尽管JFFS1/2文件系统也能应用于NAND Flash,但由于它在内存占用和启动时间方面针对NOR的特性做了一些取舍,所以对NAND来说通常并不是最优的方案。NAND上的每一页数据都有额外的空间用来存储附加信息,YAFFS正好利用了该空间中一部分来存储文件系统相关的内容。
YAFFS (Yet Another Flash File System, http://www.yaffs.net)文件系统是专门针对 NAND 闪存设计的嵌入式文件系统,目前有YAFFS和YAFFS2两个版本,两个版本的主要区别之一在于 YAFFS2能够更好地支持大容量的NAND Flash芯片,而前者只针对页大小为512字节的NAND。

全面详解终端设备

在Linux系统中,终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。tty是Teletype的缩写,Teletype是最早出现的一种终端设备,很像电传打字机,是由Teletype公司生产的。Linux系统中包含如下几类终端设备。

1.串行端口终端(/dev/ttySn)

串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。这些串行端口所对应的设备名称是/dev/ttySO(或/dev/tts/0)、/dev/ttySl (或/dev/tts/1)等,设备号分别是(4,0)、(4,1)等。

Linux 2.6内核的特点

尽管Linux 2.4目前仍然被广泛应用,但是本书是基于Linux 2.6内核的。从2003年12月Linux 2.6.0发布至今,一直还处于开发之中,并还将稳定较长一段时间。Linux 2.6相对于Linux 2.4有相当大的改进,主要体现在如下几个方面。

1.新的调度器

2.6版本的Linux内核使用了新的进程调度算法,它在高负载的情况下执行得极其出色,并且当有很多处理器时也可以很好地扩展。

2.内核抢占

在2.6版本的Linux内核中,内核任务可以被抢占,从而提高系统的实时性。这样做最主要的优势在于可以极大地增强系统的用户交互性。

缓存系统解析

每个缓存服务器只有有限大小的磁盘和内存可以作为缓存使用。因为我们的照片工作集太大以至于缓存被填满。一个填满的缓存需要经常决定迁出哪个对象来为新来的对象腾出空间。该过程基于一个替换或“迁出”算法。虽然存在着很多的迁出算法,但是最通用的算法是采用最近最少使用(Least Recently Used , LRU)原则。
我们提过磁盘是基础设施中最慢的部分,对其的访问最耗时间。多数大型网站通过将数据缓存在不同位置来减轻这种昂贵操作的需求。

在Web架构中,缓存最经常被用于存储数据库结果(比如用Memcached)或实际文件 (比如用Squid和Varnish)。这两种方法对容量规划都要求有所考虑。它们是反向代理的示例,都是将缓存数据从Web服务器发向客户端(通常是Web浏览器)的专门系统。

«383940414243444546474849505152»
最近发表
控制面板
您好,欢迎到访网站!
  [查看权限]
网站分类
搜索
Tags列表
网站收藏
图标汇集
  • 订阅本站的 RSS 2.0 新闻聚合
友情链接

热门搜索: 外链域名 高外链域名 高收录域名

Copyright www.thyst.cn. Some Rights Reserved.