经典的基于图着色模型的寄存器分配
2016-05-07 14:58
483 查看
经典的基于图着色模型的寄存器分配:
1、如果变量(在指令/语句序列中,或称程序“基本块”?)不再被use(def也是use),则它dead
2、否则变量live(活着)
3、如果2个变量在一个block/program中都是live,则不能赋以相同的寄存器,在对应的RIG(register inference graph)中,在这2个变量节点之间连接一条边
由上面的描述可以看到,这里的寄存器分配实际上是一个全局算法。并不是只针对单个basic block的。
OK,设限制为k个寄存器,则寄存器分配问题转换为RIG的k-着色问题。NP-hard。
评论:这里的寄存器分配似乎没有涉及到IR?并且是把程序代码中的变量直接映射为机器物理寄存器?对于早期的偏重于数值计算的Fortran语言来说,当然很合理。但是现代语言早已不是这个样子的了:OOP、并发、FP、VM、IR、SSA。那么关于上面的基本约束:如果2个变量同时live,则不能赋以相同寄存器。这条约束是否还有意义呢?
基于图着色模型的寄存器分配算法仅仅是个理论模型,实际所谓的最优并不可能达到,从而需要使用某些启发式。既然如此,为什么不一开始就直接使用某些实用的固定规则呢?假如这样得到的寄存器分配效率并不差多少?
Spilling:将(全局范围的)变量分配到内存而不是寄存器,这样每次用到时都需要先load最后将更新后的值store回去。这将使得一个大的program可以拆分为多个小的sub range,每个range内可使用更少的k-着色。(不过这种思路实在有点见鬼,为什么不在一开始就直接利用利用启发式这么做呢?非得等全局的图着色寄存器分配算法分析过后再rollback?)
1、如果变量(在指令/语句序列中,或称程序“基本块”?)不再被use(def也是use),则它dead
2、否则变量live(活着)
3、如果2个变量在一个block/program中都是live,则不能赋以相同的寄存器,在对应的RIG(register inference graph)中,在这2个变量节点之间连接一条边
由上面的描述可以看到,这里的寄存器分配实际上是一个全局算法。并不是只针对单个basic block的。
OK,设限制为k个寄存器,则寄存器分配问题转换为RIG的k-着色问题。NP-hard。
评论:这里的寄存器分配似乎没有涉及到IR?并且是把程序代码中的变量直接映射为机器物理寄存器?对于早期的偏重于数值计算的Fortran语言来说,当然很合理。但是现代语言早已不是这个样子的了:OOP、并发、FP、VM、IR、SSA。那么关于上面的基本约束:如果2个变量同时live,则不能赋以相同寄存器。这条约束是否还有意义呢?
基于图着色模型的寄存器分配算法仅仅是个理论模型,实际所谓的最优并不可能达到,从而需要使用某些启发式。既然如此,为什么不一开始就直接使用某些实用的固定规则呢?假如这样得到的寄存器分配效率并不差多少?
Spilling:将(全局范围的)变量分配到内存而不是寄存器,这样每次用到时都需要先load最后将更新后的值store回去。这将使得一个大的program可以拆分为多个小的sub range,每个range内可使用更少的k-着色。(不过这种思路实在有点见鬼,为什么不在一开始就直接利用利用启发式这么做呢?非得等全局的图着色寄存器分配算法分析过后再rollback?)
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析