奔向64位(40)

软件世界

  ①序 言

  从软件到硬件,64位的计算平台已经搭建起来了。对于程序员来说,尽快了解新平台的特性,熟悉在新平台下编程所带来的新方法、新编码风格,对他的职业生涯发展可谓至关重要。在这个栏目里,我们就带领大家走近64位程序设计,希望大家能多多了解它、熟悉它、运用它。

  计算平台转换的目的

  在现代计算机应用的场合,除了一些极端的情况之外,大多数时候,运算速度已经不是最核心的问题,问题越来越集中在“空间不够”的场合,而缓冲区只能解决部分的问题,更不用说利用第二级甚至第三级的存储器进行倒页时引发的性能灾难了。我们已经进入了以存储器为核心的计算机体系结构时代,因此,从32位到64位的改变,与其说是为了拓宽CPU的总线带宽,还不如说,主要是为了增加内存的寻址能力,以把尽可能多的存储需求放在第一级存储器中完成。

  新平台核心特征

  相比旧的32位平台,新平台最显著的不同当然就是虚拟内存和寻址空间的不同,这是每次CPU的总线带宽加倍后开发者都必须面对的。64位的Windows把地址的表示位数增加了4位,从32位增加到了36位。所以一个应用程序的独享空间也就从4GB变成了64GB,其中24GB为核心态代码征用,40GB留给应用程序。

  新指令规范简介

  内存的寻址方式不仅影响到汇编层,也会对高级语言的程序设计产生不小的影响。开发者必须清醒地意识到存在着两种不同的64位指令规范,分别由Intel公司和AMD公司提供。它们当然是基本兼容的,但是又不可能是完全兼容的。IA-64的最佳实现当然是Itanium微处理器,它有328个寄存器,通用寄存器(general-purposed register)达128个。从软件的视角来看,如此大量的寄存器可资利用,变量就更有可能直接在寄存器级得到存储而不必访问内存。

  每条标准的IA-64指令长度为41位,由于有128个通用寄存器,所以需要用7位来表示寄存器的编号。两个源操作寄存器加一个目的操作寄存器,合起来就是21位。每条指令还能够指定64个谓词寄存器(predicate register)中的一个,这就又用去6位。余下的14位用于指定伪操作号和寻址。每三条指令被捆扎成一“束”(bundle),而不同的束被捆扎成一“组”(group),同一组的指令是可以流水的,不存在读写依赖。组的长度是任意的。送到总线上去的指令除了一个束外,还有额外的5位。这5位中有一位是指定组的结束标志。指令束的捆扎是CPU完成的,而组的捆扎则是编译器完成的,编译器必须保证捆扎的正确性。

  我们这次的讨论将以IA-64为基础,但不讨论汇编层。以C/C++为蓝本,使用微软Windows XP 64-bit Edition作为基础平台,使用微软Visual Studio 2005作为编译器。为了配合64位平台的新特征,新平台下的C/C++引入了许多新的数据类型和新的操作函数。我们将在下一讲中,仔细地研究这些变化以及这些变化给编码的风格带来的影响。

  预告:下期将为大家讲解新平台下的数据处理,包括整数和字符,引入的新数据类型以及移植型问题。