2014年计组经典大题

某程序中有如下循环代码段“for(int i=0;i<N;i++) sum+=A[i]”,假设编译时变量sum和i分别分配在寄存器R1和R2中。常量N在寄存器R6中,数组A的首地址在寄存器R3中。程序段起始地址为0804 8100H,对应的汇编代码和机器代码如下表所示。

执行上述代码的计算机M采用32位定长指令字,其中分支指令bne采用如下格式:

OP为操作码,Rs为寄存器编号,OFFSET为偏移量,用补码表示。

1.M的存储器编址单位是什么?

【解析】

已知计算机M采用32位定长指令字,即一条指令占4B,观察表中各指令的地址可知,每条指令的地址差4个地址单位,即4个地址单位代表4B,一个地址单位就代表了1B,所以是按字节编址。

2.已知sll指令实现左移功能,数组A中每个元素占多少位?

【解析】

在二进制中某数左移2位相当于乘以4,由该条件可知,数组间的数据间隔为4个地址单位,而计算机按字节编址,所以数组A中的每个元素占4B。

(注:数组是连续存放的)------详细汇编过程如下图分析所示:

3.bne指令的OFFSET字段的值是多少?已知bne指令采用相对寻址方式,当前PC内容为bne指令地址,通过分析表中指令地址和bne指令内容,推断出bne指令的转移目标地址计算公式。

【解析】

求OFFSET【法一】

Bne指令的机器代码为1446FFFAH,根据题目给出的指令格式,后2B的内容为OFFSET字段,所以该指令的OFFSET字段为FFFAH,用补码表示,(要求值则先将补码转为原码1000 0000 0000 0110)值为-6。

求OFFSET【法二】

FFFAH+0006H=(1)0000H,故FFFAH对应真值为-6.

第二小问:

系统执行到bne指令时,PC自动加4,PC的内容为0804 8118H,而跳转的目标是0804 8100H,两者相差了18H,即24个单位的地址间隔

[24的计算过程]08048100H=08048114H+4(个地址单位)+k×(-6)

k×(-6)=08048100H - 08048118H=-18H

k×(-6)=-(1×161+8×160)=-24,因此k=4

所以偏移地址的一位即是真实跳转地址的-24/-6=4位。可知bne指令的转移目标地址计算公式为(PC)+4+OFFSET×4(此处的OFFSET代表要偏移的指令的数量)

(注:转移指令转移地址的一般形式:目的地址=(PC)+指令字长+k×OFFSET

4.若M采用如下“按序发射、按序完成”的5级指令流水线:IF(取值)、ID(译码及取数)、EXE(执行)、MEM(访存)、WB(写回寄存器),且硬件不采取任何转发措施,分支指令的执行引起3个时钟周期的阻塞,则P中哪些指令的执行会由于数据相关而发生流水线阻塞?哪条指令的执行会发生控制冒险?为什么指令1的执行不会因为与指令5的数据相关而发生阻塞?

【解析】由于数据相关而发生阻塞的指令为第2、3、4、6条,因为第2、3、4、6条指令都与各自一条指令发生数据相关。第6条指令会发生控制冒险。

当前循环的第5条指令与下次循环的第1条指令虽然有有数据相关,但由于第6条指令后有3个时钟周期的阻塞,因此消除了该数据相关。

第二部分:假设对于 44 题中的计算机 M 和程序 P 的机器代码,M 采用页式虚拟存储管理;P开始执行时,(R1)=(R2)=0,(R6)=1000,其机器代码已调入主存但不在Cache 中;数组 A 未调入主存,且所有数组元素在同一页,并存储在磁盘同一个扇区。

(1)P 执行结束时,R2 的内容是多少?

(1)R2 里装的是 i 的值,循环条件是 i<N(1000),即当 i 自增到不满足这个条件时跳出循环,程序结束,所以此时 i 的值为 1000。(1 分)

(2)M 的指令 Cache 和数据 Cache 分离。若指令 Cache 共有 16 行,Cache 和主存交换的块大小为 32 字节,则其数据区的容量是多少?若仅考虑程序段 P 的执行,则指令 Cache 的命中率为多少?

【解析】Cache 共有 16 行,每块 32 字节,所以 Cache 数据区的容量为 16*32B=512B。 (1 分)P 共有 6 条指令,占 24 字节,小于主存块大小(32B),其起始地址为 0804 8100H,对应一块的开始位置,由此可知所有指令都在一个主存块内。读取第一条指令时会发生 Cache缺失,故将 P 所在的主存块调入 Cache 某一行,以后每次读取指令时,都能在指令 Cache中命中。因此在 1000 次循环中,只会发生 1 次指令访问缺失,所以指令 Cache 的命中率为:(1000×6-1)/(1000×6)=99.98%。 (2 分)

(3)P 在执行过程中,哪条指令的执行可能发生溢出异常?哪条指令的执行可能产生缺页异常?对于数组 A 的访问,需要读磁盘和 TLB 至少各多少次?

【解析】指令 4 为加法指令,即对应 sum+=A[i],当数组 A 中元素的值过大时,则会导致这条加法指令发生溢出异常;而指令 2、5 虽然都是加法指令,但他们分别为数组地址的计算指令和存储变量 i 的寄存器进行自增的指令,而 i 最大到达 1000,所以他们都不会产生溢出异常。(2 分)

只有访存指令可能产生缺页异常,即指令 3 可能产生缺页异常。(1 分)

(题目说了:数组 A 未调入主存,且所有数组元素在同一页,并存储在磁盘同一个扇区。说明一次访问磁盘就能把整个数组取出来

因为数组 A 在磁盘的一页上,而一开始数组并不在主存中,第一次访问数组时会导致访盘,把 A 调入内存,而以后数组 A 的元素都在内存中,则不会导致访盘,所以该程序一共访盘一次。(2 分)

每访问一次内存数据就会查 TLB 一次,共访问数组 1000 次,所以此时又访问 TLB1000次,还要考虑到第一次访问数组 A,即访问 A[0]时,会多访问一次 TLB(第一次访问 A[0]会先查一次 TLB,然后产生缺页,处理完缺页中断后,会重新访问 A[0],此时又查 TLB),所以访问 TLB 的次数一共是 1001 次。(2 分)

【评分说明】

①对于第 1 问,若答案中除指令 4 外还包含其他运算类指令(即指令 1、2、5),则给 1分,其他情况,则给 0 分。

②对于第 2 问,只要回答“load 指令”,即可得分。

③对于第 3 问,若答案中给出的读 TLB 的次数为 1002,同样给分。若直接给出正确的TLB 及磁盘的访问次数,而未说明原因,给 3 分。若给出的 TLB 及磁盘访问次数不正确,但解题思路正确,可酌情给分。

附1:流水线的三种相关

一。资源相关(结构相关/结构冒险)

概念:多条指令在同一时钟周期要使用同一部件

举例:2条指令同时访存(第I1条的MEM【访取数】与第I4条的FI段【访取指令】)

解决方案:第I4条FI段加个停顿再开始 或 把指令和数据分别放在2个存储器

二。数据相关(数据冒险)

指一个程序中存在必须等前一条指令执行完才能执行后一条指令的情况,称这两条指令为数据相关。

(1)写后读(RAW)

注意英文RAW--read after write是写后读,不要看英文顺着读,搞反了。

【写后读】字面理解应该是先写入再读取,而现在是没有写入就已经读了(即读了旧数据),出错

(2)读后写(WAR)

现在是写入后再读(本来应读取旧数据,现在却读了新数据)

(3)写后写(WAW)

字面理解是前面一条指令先写数据,然后后一条指令再写(现在却恰好相反了,出错)

解决方案:等数据写入再读(延后) 或 数据旁路

数据旁路】不等前一条指令把运算结果写回寄存器,而是直接把该结果作为输入数据给下一条需要该结果的指令(下一条指令不需再读寄存器),从而使流水线不发生停顿。

三。控制相关(控制冒险)

概念:转移指令惹的祸。

解决方案:先选定转移分支的一个,按它取指并处理,条件码生成后,如果猜测正确则流水线继续进行,若猜测错误则之间预取的指令失效。

附2:五段流水线

IF(Instruction Fetch):取指,所有指令共有的部分,访存取指到IR

ID(Instruction Decode):译码,所有指令共有的部分,将IR的指令译码, 此时也默认会取寄存器数

-----------------PS:这里提下【按序发射】指 下一条指令的取指和上一条的译码阶段并行,正确说法举例:流水线按序流动时,在RAW、WAR、WAW中,只可能出现RAW相关。-----------------------------

EXE(EXEcute):运用ALU,其中加法取反等运算指令直接对操作数进行运算,访存指令用于计算下址。

MEM(MEMory):访存指令用于访存过程,不访存的指令直接跳过。

WB(Write Back):运算指令将结果输出到寄存器,load指令访存写回寄存器。

整个指令执行过程只有EXE使用ALU,避免了资源冲突。由于IF、MEM都可能访存,因此通常设置指令Cache数据Cache避免资源冲突。

发生阻塞的情况:

关于流水线的指标

(1)【吞吐率】单位时间内执行的指令条数

(2)【流水线效率】任务所占的面积 / 总面积

注意:下图的纵坐标(从下往上)依次是Cache1、Cache2、A、B1、B2、B3、C

包含1的所有东东组成一条流水线,2,3等等同理。

猜你喜欢

转载自blog.csdn.net/qq_35812205/article/details/106559830