系统结构-2-3指令操作码的优化:哈夫曼编码

2020系统结构系列文章


考完这么久了,还在搞题目,我都佩服自己。

指令格式

指令是由操作码地址码两部分组成的。

指令优化

就指令格式的优化来说,是指如何用最短的位数来表示指令的操作信息和地址信息,使程序中指令的平均字长最短。
操作码的优化,也就是最短的位数来表示指令的操作信息。

定长的操作码的组织方案

固定位数:比如操作码固定为6位。
在指令字最高位部分分配固定的若干位用于表示操作码,有利于简化计算机硬件设计,提高指令译码和识别速度。
例如: 1BM360机、教学计算机

变长的操作码的组织方案

不固定位数:操作码可以是6位也可能是7位8位。
在指令字最高位部分用一固定长度的字段用于表示基本操作码,而对于部分操作数地址少的指令把它们的操作码扩充到该指令的操作数地址字段,即操作码可以变长。
这种方法在不增加指令字长度的情况下可表示更多的指令,但增加了译码和分析难度,需更多硬件支持

指令操作码部分的优化

如何优化?
首先我们要知道操作码部分的优化指的是变长操作码的优化。因为定长操作码没有优化空间。
优化的思路就是:想办法将指令的操作码的位数变短。

如何做?
根据指令的使用频度,我们应该把最常用的指令尽可能用最短的位数来表示。这就涉及到了哈夫曼压缩概念

哈夫曼压缩概念的基本思想是,当各种事件发生的概率不均等时,采用优化技术,对发生概率最高的事件用最短的位数(时间)来表示(处理),而对出现概率较低的事件允许用较长的位数(时间)来表示(处理),就会使表示"(处理)的平均位数(时间)缩短。
研究操作码的优化表示,主要是为了缩短指令字长,减少程序总位数及增加指令字能表示的操作信息和地址信息。要对操作码进行优化表示,就需要知道每种指令在程序中出现的概率(使用频度),一般可通过对大量已有的典型程序进行统计求得。

哈夫曼编码

前面我们已经知道了哈夫曼编码的概念。接下来根据例题来实际应用一下,题目如下:
在这里插入图片描述
结题思路:1、利用哈夫曼算法构造哈夫曼树。
构造哈夫曼树非常简单,将所有的节点放到一个队列中,用一个节点替换两个频率最低的节点,新节点的频率就是这两个节点的频率之和。这样,新节点就是两个被替换节点的父节点了。如此循环,直到队列中只剩下一个节点(树根)。
在这里插入图片描述
2、根据绘制出的哈夫曼树,从根节点开始,沿线到达各频度指令所经过的代码序列就构成该频度指令的哈夫曼码,如下表所示:
在这里插入图片描述
3、根据编码表计算平均码长。
如下图,计算出来的平均码长为2.2位,非常接近于题目中给出的H,且这种编码的信息冗余仅有1.36%,远远小于三位定长码的信息冗余(28%)。所以,完全的哈夫曼编码是最优化的编码。
但是这种编码的码长种类太多。如上表,7种指令就出现了4种码长,长度有1有2有3有5,不规整,不易于编码。为此,结合用一般的二进制编码,在哈夫曼编码的基础上进行扩展。
在这里插入图片描述

扩展操作码编码

扩展操作码编码是介于定长二进制编码和完全的哈夫曼编码之间的一种编码方式,操作码不是定长的,但只有有限的几种码长。如上述题目,如果要求只能用固定两种码长,表示7条指令,应该使用什么编码方案?

最优的情况,肯定是尽可能用短的。所以我们先从最短码长开始考虑。

码长为1的情况,此时可以只能表示2条指令(2的1次方:0和1),拿出1条用来扩展,扩展出几位呢?
1位,又可以表示2条,(2-1)+2=3<7,不足表示;
2位,又可以表示4条,(2-1)+4=5<7,不足表示;
3位,1+8=9>7,满足条件。
第一种方案出来了,码长为1的有1条,码长为4的有6条,平均码长=10.4+4(…)=2.8
注意:不足表示的情况,其实还可以继续扩展,但是这样就不符合两种码长的限制了。

码长为2的情况,此时可以只能表示4条指令(2的2次方:00,01,10,11),3条占用,拿出1条用来扩展,扩展出几位呢?
1位,又可以表示2条,(4-1)+2=5<7,不足表示;
2位,又可以表示4条,(4-1)+4=7=7,满足条件。
第二种方案出来了,码长为2的有3条,码长为4的有4条,平均码长=2*(0.4+0.3+0.15)+4*(…)=2.3

码长为3的情况,此时可以表示8条指令(2的3次方:000,001,010,011,100,101,110,111),足以表示,但是就不符合两种码长的要求,所以直接pass。而且之后的码长>3的情况,也都不符合。

综上,目前,我们只有两种方案,只需要比较哪个平均码长最短既可以了。
结论,最优编码方案:按照指令使用频度值将指令分为两组,频度较高的3条指令I1、I2、I3采用2位操作码编码表示,留下一个2位编码作为扩展标志,扩展出2位,用来编码其余频度较低的4条指令。平均码长为2.3。(很显然,扩展操作码编码的平均码长是大于哈夫曼编码的,冗余更多,浪费了一些,但是规整。硬件实现比较方便)

具体编码方案如下:在这里插入图片描述

热爱编程的小水怪,欢迎关注。有错请指出,一起加油。

猜你喜欢

转载自blog.csdn.net/changhuzichangchang/article/details/119187648
今日推荐