2.1 数据表示
本节主要介绍一些新的数据表示方法,如自定义数据表示等,也介绍一些数据表示方面的新的研究成果,如浮点数表示方面的研究成果等。一些常用的数据表示方法,如定点数、逻辑数、浮点数、字符、字符串、堆栈等,这些基本的数据表示方法已经在其它课程中都学过了。
2.1.1 数据表示与数据类型
在计算机系统中,数据的类型有多种多样,如文件、图、表、树、阵列、队列、链表、栈、向量、串、实数、整数、布尔数、字符等。计算机体系结构首先要研究的一个内容就是要确定:所有这些数据类型中,哪些用硬件实现,哪些用软件实现,并研究它们的实现方法等。
数据表示研究的是计算机硬件能够直接识别,可以被指令系统直接调用的那些数据类型。数据表示是数据类型中最常用,也是相对比较简单,用硬件实现相对比较容易的几种。如定点数(整数)、逻辑数(布尔数)、浮点数(实数)、十进制数、字符、字符串、堆栈和向量等。
数据结构研究的是面向系统软件,面向应用领域所需要处理的各种数据类型,研究这些数据类型的逻辑结构和物理结构之间的关系,并给出相应的算法。除了数据表示之外的所有数据类型,一般来说都是数据结构要研究内容。因此,数据表示和数据结构都是数据类型的子集。确定哪些数据类型用数据表示实现,哪些数据类型用数据结构实现,实质上是计算机系统设计中的软件与硬件的取舍问题。
如何确定数据表示这个子集是计算机体系结构设计人员要解决的难题之一。从原理上讲,计算机系统只要有了最简单的数据表示,如定点数表示,就能用软件实现其它各种各样的数据类型,包括很复杂的数据类型。例如,能够用定点运算的指令编写的子程序来实现浮点运算,实现逻辑运算,实现十进制运算,实现字符运算,模拟堆栈运算等。当然,这种系统的性能可能很差。相反,如果把许多很复杂的数据类型都用数据表示来实现,系统的硬件代价就会很高。
确定哪些数据类型用数据表示来实现的原则主要有三个,一是缩短程序的运行时间,二是减少CPU与主存储器之间的通信量,三是这种数据表示的通用性和利用率。下面举两个例子来说明。
例2.1:如果用定点数据表示实现浮点运算,处理机的运算速度要降低两个数量级。
如果用一台定点运算速度为每秒1千万次的计算机做科学计算,它的实际运算速度将低于每秒十万次。这是因为,当计算机系统中没有浮点数据表示时,通常要用子程序来实现浮点运算。用定点运算指令来实现32位的浮点运算,平均要执行100条以上的指令。CPU与主存储器之间的通信量也将增加100多倍。尽管增加浮点数据表示,硬件的复杂度要增加许多,但是,由于浮点数据表示的通用性好,利用率高,在以科学计算为主的计算机系统中,设置浮点数据表示是必不可少的。
例2.2:实现A=A+B,A和B均为200×200的矩阵。
如果在没有向量数据表示的计算机系统上实现,一般需要6条指令,其中有4条指令要循环4万次。因此,CPU与主存储器之间的通信量:
取指令2+4×40,000条,
读或写数据3×40,000个,
共要访问主存储器7×40,000次以上。
如果在有向量数据表示的计算机系统上实现,只需要一条指令。从而,减少CPU与主存储器之间的通信量:少取指令4×40,000次,缩短程序执行时间一倍以上。
随着计算机系统的发展,数据表示也在不断地上移。例如,在目前的计算机系统中,字符串数据表示,向量数据表示,堆栈数据表示等已经普遍使用。有些很复杂的数据表示,如图、表等数据表示也开始在某些计算机系统中出现。
另外,还应该指出,对于一些复杂的数据类型,如果用数据表示来实现,硬件的代价可能非常大,然而,可以用硬件给以适当的支持,或者说,用软件和硬件相结合的方法来实现,效果会很好。例如,用字节编址和字节运算指令来支持字符串数据表示。用变址寻址方式来支持向量数据表示等。
因此,在设计计算机系统时,对于数据类型,系统结构设计者首先要做的是:确定哪些数据类型全部用硬件实现,即数据表示;哪些数据类型用软件实现,即数据结构;哪些数据类型可由硬件给予适当的支持,即由软件和硬件共同来实现,并确定软件与硬件的适当比例关系。