第十五章 IA-64 体系结构,IA-64 的背景,随着Pentium 4的推出,Intel从8086开始的微处理器系列已成为最成功的计算机产品系列 Intel公司与惠普(HP)公司联手开发新一代64位体系结构,称为IA-64 IA-64 是构筑在两公司和一些大学多年研究成果之上的一种崭新体系结构 64 位结构 既不是Intel的32位x86体系结构的64位扩展 也不是HP的64位PA-RISC体系结构的改写 此体系结构借助于系统化的并行方法,并利用了最新一代微芯片技术所提供的丰富电路和高速度 背离了超标量方案,15.1 推动因素,奠定IA-64的基本概念如下: 指令级并行性 由机器指令显式表明,而不是由运行时机器确定 长或超长指令字 (LIW/VLIW) 转移判定 (不同于转移预测) 推测装入 Intel & HP 将这些概念称之为显式并行指令计算 (EPIC) IA-64 指使用 EPIC 技术实现的指令集体系结构 Itanium 是 Intel 第一个IA-64体系结构产品,超标量 vs IA-64,为何采用新的体系,目前的芯片上可容纳上千万个晶体管,如何充分利用这些晶体管? 建造更大的cache 可能导致命中率减小 加入更多的执行单元来提高超标量的并行度 越来越多的执行单元加入,使得处理器需要更多的逻辑来指挥这些单元协调动作 转移预测必须改进,无序处理必须使用,更长的流水线必须被采用 但是,越长的流水线,预测错误所带来的性能损失也越大 无序执行要求更多的换名寄存器和更复杂的用于处理相关性的内部锁定电路 结果是,当今最好的处理器也只能做到每周期回收4条指令,通常是更少,显式并行性,编译时由编译器静态地调度指令,而不是运行时由处理器动态地调度指令 并在机器指令中包括这些信息 处理器使用这些信息完成并行执行 优点:EPIC处理器不需要使用非常复杂的电路 而且,处理器只有纳秒(ns)的时间来确定潜在的并行执行性, 而编译器却有高出几个数量级的时间来充裕地考察程序,并能将程序作为整体来考虑,15.2 通常组织,关键特性,大寄存器组 IA-64指令格式要求使用256个寄存器: 128个64位寄存器作为整数、逻辑和通用寄存器 128个82位寄存器作为浮点和图形寄存器使用 还有64个1位判定寄存器,用于判定执行 多个执行单元 8个或更多 执行单元的数量与可用的晶体管数有关。
若机器语言指令流指出8条整数指令可并行执行,一个只有4条整数流水线的处理器必须分两块来执行这些指令 而一个具有8条流水线的处理器,则可同时执行8条指令IA-64 执行单元,I单元: 整数算术 移位-与-加,逻辑运算 比较和整数多媒体指令 M单元: 寄存器和存储器之间的装入和存储以及某些整数ALU运算 B单元: 用于转移类指令 F单元: 用于浮点类指令指令类型和执行单元类型的关系,15.3 判定、推测和软件流水,指令格式(1) IA-64 定义了一个含有3条指令和1个属性字段的128位的束(bundle),每条指令称之为音节(syllabe) 处理器一次能取一束或多束,每束带入3条指令 属性字段的信息指示哪些指令能并行执行,处理器能查看多束来确定其中哪些指令可并行执行 例如,一指令流中有8条指令能并行执行,编译器将重排序这些指令使它们分散在连续的几个束中,并相应设置属性值于是,处理器知道这8条指令是互不相关的,指令槽 2,指令槽 1,指令槽 0,属性,主操 作码,(a) IA-64 的束,(b) 通常的 IA-64 的指令格式,(c) 典型的 IA-64 的指令格式,PR=判定寄存器 GR=通用寄存器或浮点寄存器,128位的束,41位的指令,指令格式(2),每条指令有定长的41位格式 比RISC和RISC超标量机器的传统32位格式长,然而比Pentium 4上的118位微操作短 两个因素致指令比较长: IA-64比典型的RISC和RISC超标量机器使用更多的寄存器,1个整数寄存器、128个浮点寄存器 为适应判定执行技术,IA-64机器包括了64个判定寄存器,汇编语言格式,[qp] mnemonic [.comp] dest = srcs //注释 qp – 1 位的判定寄存器 如果此寄存器在执行时值为 1 ,则指令执行结果在硬件中被托收,否则被丢弃 mnemonic – 指令助记符 comp – 一个或多个的指令完整符,用点号分割 dest –目的操作数,通常是一个 srcs –源操作数,多数指令有两个或更多 指令组和休止用双分号 ;; 表示 一个指令组定义为一个无“写后读”和“写后写”相关性的指令序列 处理器发射这些指令无需硬件检查寄存器之间的相关性,汇编语句举例,ld8 r1 = [r5] ;; //第一组 add r3 = r1, r4 //第二组 第一条指令由存储器读取8字节值装入寄存器r1,存储器地址在寄存器r5中。
第二条指令将r1和r4的内容相加,结果放人r3中 因为第二条指令要读取r1的内容,而它又被第一条指令修改(即存在“写后读”相关性),故两条指令不能放在同一组中来并行执行判定执行,指令4(P1),1. 这条转移指令不再出现,此比较指令有两种可能结果,指令5(P1),指令6(P1),指令7(P2),指令8(P2),指令9(P2),指令1,指令2,指令3 (转移),,,2. 编译器按照路径为每条指令指派一个判定寄存器,4.沿这条路径的所有指令指向判定寄存器P2,3. 沿这条路径的所有指令指向判定寄存器P1,5.CPU开始由两路径执行指令,6. CPU能并行执行不同路径中的指令,因为它们之间无相关性,,7. 当CPU知道比较的结果时,它作废无效路径上的结果,为并行执行,编译器可重排指令次序: 指令4和7一对,5和8一对,6和9一对,,推测装入,1. 编译器扫描源代码并看见一条即将到来的Load指令它移走此Load指令,在这里插入一条推测转入指令,在操作(指令9)看见数据之前插入一条推测检查指令,,2. 运行时,这条指令在实际需要数据之前装入数据如果此装入触发异常,则CPU延期报告此异常,5. 实际上,IA-64 将装入提升到转移之前,3. 编译器在上面已用推测装入代替了这个装入,故指令8实际上已经不存在,4. 这条指令检查数据的有效性。
如果数据OK,则CPU不报告异常,控制&数据推测,控制推测 亦即推测装入 在指令实际需要数据之前装入数据,避免了存储器取数延迟 数据推测 控制推测不能解决的问题: 一条装入指令提升到一条存储指令之前,而此存储指令所更改的内容可能是此装入的源 数据推测解决这种提前装入可能导致的错误 进行检查,以保证装入的是正确值,软件流水,L1: ld4 r4=[r5],4 ;; //周期0;装入后地址增量4add r7=r4,r9 ;; //周期2st4 [r6]=r7,4 //周期3 ;存入后地址增量4br.cloop L1 ;; //周期3 这个循环将一个常数加到一个向量上,结果存入另一向量中 以这个程序而言,在一次重复中没有指令级并行的机会 第 x 次的所有指令执行完才开始第 x+1 次重复 然而,若装入和存储无地址冲突( r5 和 r6 指向不重叠的存储位置),则将第 x+1 次重复中的不相关指令移到第 x 次重复中来执能提高利用率,展开的循环,ld4 r32=[r5],4;; //周期 0 ld4 r33=[r5],4;; //周期 1 ld4 r34=[r5],4 //周期 2 add r36=r32,r9;; //周期 2 ld4 r35=[r5],4 //周期 3 add r37=r33,r9 //周期 3 st4 [r6]=r36,4;; //周期 3 ld4 r36=[r5],4 //周期 3 add r38=r34,r9 //周期 4 st4 [r6]=r37,4;; //周期 4 add r39=r35,r9 //周期 5 st4 [r6]=r38,4;; //周期 5 add r40=r36,r9 //周期 6 st4 [r6]=r39,4;; //周期 6 st4 [r6]=r40,4;; //周期 7,展开的循环(2),展开的循环用8个周期完成5次重复 而原来的循环却需要20个周期 这里认为存储器有两个端口 装入和存储能并行执行,软件流水举例,周期 0,周期 1,周期 2,周期 3,周期 4,周期 5,周期 6,周期 7,时间,起始期,核心期,结尾期,对软件流水的支持,自动寄存器重命名 一组固定数目的判定和浮点寄存器 (p16-P32, fr32-fr127) 和一组数目可编程指定的通用寄存器 (最大范围 r32-r127) 能够轮换使用 判定 循环中的每条指令都要在一个轮转式判定寄存器上被判定, 以确定此时流水是处于起始、核心还是结尾期 专门的循环结束指令 这是一些引起寄存器轮转和循环计数减量的转移指令,IA-64 寄存器组,IA-64 寄存器 (1),通用寄存器 128 个,64 位 r0-r31 是静态的,无法重命名 r32-r127 作为轮转寄存器,能用于软件流水和寄存器堆栈的实现 对它们的引用是虚拟的,硬件可动态地完成重命名 浮点寄存器 128 个,82 位 能满足 IEEE 745 双精度浮点数的需要 fr0-fr31 是静态的, fr32-fr127 能作为轮转寄存器,用于软件流水,IA-64 寄存器 (2),判定寄存器 64 个 1 位寄存器用于判定 pr0 固定为 1 ,允许无判定的指令 pr1-pr15 静态的, pr16-pr63 可轮转 转移寄存器 8 个 64 位寄存器(br0-br7)用于转移 指令指针 保存当前执行的IA-64指令的束地址,当前帧标示器 保持通用寄存器堆栈当前栈的相关信息以及 fr 和 pr 寄存器的轮转信息 用户屏蔽 一组单个位值用于定位陷阱,性能监控和浮点寄存器使用的监控 性能监控数据寄存器 用于支持处理器实现相关性能 应用寄存器 专用寄存器,表15.5,IA-64 寄存器 (3),寄存器堆栈,能够避免过程调用和返回时的不必要的数据传入/传出寄存器操作 为被调过程可提供一个多达96个寄存器(r32-r127)组成的新堆栈帧 编译器为过程指派所需的寄存器数量 局部的(仅供本过程使用) 输出的(向被调的子过程传递参数) 寄存器重命名使得前一帧的局部寄存器被隐藏,前一帧的输出寄存器在被调过程中具有从 r32 开始的新寄存器编号 范围在 r32-r127的物理寄存器以环形缓冲器的样式分配给过程需要的虚拟寄存器 必要的话,硬件还能采用存储器作为寄存器后援,过程调用和返回时寄存器堆栈的行为,指令执行,调用者桢(过程A),调用,被调者桢(过程B) (调用之后),分配,被调者桢(过程B) (分配之后),返回,调用者桢(过程A) (返回之后),堆栈式通用寄存器,A局部,A输出,B1输出,B2局部,B2输出,A局部,A输出,sofa=21,sola=14,sof b1=7,sof b2=19,sol b2=16,sofa=21,sola=14,,CFM=当前栈桢显示器 PFS=先前功能状态寄存器,15.5 Itanium 处理器组织,超标量特征 6路宽、10段深的硬件流水线 动态预取 转移预测 适应编译时不确定性的寄存器记录板 EPIC 特征 支持判定执行、控制推测、数据推测和软件流水的硬件,。