横线上方为基础知识和解题思路,横线下方为具体题目解答
考试考的大部分是课后题,但是不完全是老师划的题,所以尽量全部复习
这些考试资料只是一些绝大部分正确的感性资料,需要你自己去总结思考
让我重学一遍,我会以课程视频为基础(b站有回放你也可以自己录)把每个课后题搞清楚,当然前提是你不要选太多的课
The original test question is useful
——沈阳计算技术研究所 2022.1.10

计算机体系结构

第二章

  1. 在3台不同指令系统的计算机上运行同一程序P时,A机需要执行 1.0∗1081.0 * 10^81.0∗108 条指令,B机需要执行 2.0∗1082.0 * 10^82.0∗108 条指令,C机需要执行 4.0∗1084.0 * 10^84.0∗108 条指令,但实际执行时间都是10s。请分别计算这3台机器在运行程序P时的实际速度,以MIPS为单位。这3台计算机在运行程序P时,哪一台性能最高?为什么?

MIPS=(指令数/执行时间)/106=指令数/(执行时间∗106)MIPS = (指令数/执行时间 )/ 10^6=指令数/(执行时间 * 10^6)MIPS=(指令数/执行时间)/106=指令数/(执行时间∗106),执行时间的单位是 s


运行程序P的实际速度为:A 为 10MIPS,B 为 20MIPS,C 为 40MIPS

在运行程序P时,三台计算机的运行时间相同,所以性能相同

  1. 对某处理器进行功耗测试,得到如下数据:时钟不翻转,电压1.05V时,电流为500mA;时钟频率为1GHz,电压1.1V时,电流为2500mA。请计算在1.1V下,此处理器的静态功耗以及500MHz下的总功耗。
  • 功率P=U∗I,电压U=I∗R功率P = U*I,电压U = I*R功率P=U∗I,电压U=I∗R 功率单位是W,电压单位是V,电流单位是A
  • 时钟不翻转的静态功耗计算时等效成电阻R ( R = U / I )
  • 动态功耗与时钟频率(翻转率)成正比
  • 总功耗 = 动态功耗 + 静态功耗

$1.1V 下静态功耗P = U^2/R = 1.11.1/(1.05/0.5)=0.576W $
$1.1V 下 1\mathrm{GHz} 时,动态功耗 = 总功耗-静态功耗 = 1.1
2.5-0.576=2.174W $
$1.1V 下 0.5\mathrm{GHz}时, 动态功耗为 2.174*0.5/1=1.087W $
$ 1.1V 下 0.5\mathrm{GHz}时,总功耗为 1.087+0.576=1.663W $

第三章

  1. 画出$ e = a & b| c & d$的晶体管级电路图

逻辑等价变换

  1. A∣0=A,A&1=A,A∣1=1,A&0=0A|0 = A,A\&1 = A,A|1 = 1,A\&0 = 0A∣0=A,A&1=A,A∣1=1,A&0=0
  2. A∣A=A,A&A=A,A∣∼A=1,A&∼A=0A|A = A,A\&A = A,A|\sim A = 1,A\;\&\sim A = 0A∣A=A,A&A=A,A∣∼A=1,A&∼A=0
  3. A∣B=B∣A,A&B=B&A,A|B = B|A,A\&B = B\&A,A∣B=B∣A,A&B=B&A,
  4. A∣(B∣C)=(A∣B)∣C,A&(B&C)=(A&B)&CA|(B|C) = (A|B)|C,A\&(B\&C) = (A\&B)\&CA∣(B∣C)=(A∣B)∣C,A&(B&C)=(A&B)&C
  5. A&(B∣C)=A&B∣A&C,A∣(B&C)=(A∣B)&(A∣C)A \& (B|C) = A \& B|A \& C,\color{red}A | (B\&C) = (A | B)\&(A| C)A&(B∣C)=A&B∣A&C,A∣(B&C)=(A∣B)&(A∣C)
  6. ∼(A&B)=∼A∣∼B,∼(A∣B)=∼A&∼B\sim (A\&B) = \sim A \;| \sim B,\sim (A|B) = \sim A\;\& \sim B∼(A&B)=∼A∣∼B,∼(A∣B)=∼A&∼B
  7. A∣A&B=A,A∣∼A&B=A∣B\color{red}A|A\&B = A,A|\sim A \& B = A|BA∣A&B=A,A∣∼A&B=A∣B
  8. 非门、与非门、或非门可以组成任何逻辑电路,并且非逻辑电路通常规模小,延时短。
    • 非门
    • 与非门
    • 或非门

  • A&B∣C&D=∼(∼(A&B)&∼(C&D))A\&B|C\&D=\sim(\;\sim(A\&B) \; \& \; \sim(C\&D) \;)A&B∣C&D=∼(∼(A&B)&∼(C&D)),两级与非门的逻辑 ,不是全展开

  • (老师上课画的,用上面就行)

  1. 计算一个FO4的延迟,假设反相器的输入电容为0.0036pF,平均每个负载连线电容为0.0044pF,翻转延迟为0.023ns,每pF延迟为4.5ns

本课对 FO4 定义为 1 个反相器驱动 4 个相同的反相器

FO4 延迟=本征延迟+负载延迟

  • 本征延迟:元器件固有延迟,对于 反相器 是指 翻转延迟
  • 负载延迟 = 每pF延迟 * ((输入电容 + 单个负载连续电容)* 负载个数)

FO4 延迟=本征延迟+负载延迟=0.023+4.5*((0.0036+0.0044)*4)=0.167ns

  1. 给出64位定点数原码和补码的范围,在32位定点数中0xffffffff表示多少

原码范围公式:$ -2^{n-1}-1 到 2^{n-1}-1 $

补码范围公式:$-2^{n-1} 到 2^{n-1}-1 $

0xffffffff表示-1

第四章

  1. 假定在指令系统设计中需要考虑两种条件转移指令的设计方法,这两种方法如下。

    • CPU A:先通过一条比较指令设置条件码A,再用一条分支指令检测条件码
    • CPU B:比较操作包含在分支指令中

    在两种CPU中,条件转移指令都需要两个时钟周期,所有其他指令都需要一个时钟周期。在CPU A中,全部指令的25%是条件转移指令,因为每次条件转移都需要进行一次比较,所以比较指令约占所有指令的25%。因为CPU A不需要在转移中包含分支,所以它的时钟频率是CPU B的1.2倍。请问哪一种CPU性能更高?如果CPU A的时钟频率知识CPU B的1.1倍,结果又是多少?

比性能实际是比时间,性能要联想到时间
时间 = 指令数 * 平均每条指令的时钟周期(指令延迟)
时钟频率 = 1 / 时钟周期数
$A相对于B的性能;(求A对B性能的倍数) = \dfrac{T_B}{T_A} = \dfrac{\frac{B的周期数}{B的频率}}{\frac{A的周期数}{A的频率}} $,因为时间越长性能越差


  • 假设 CPU A 总指令数为 x,根据题意,转移指令有 0.25x,每条需要两个时钟周期,比较指令 0.25x,其它指令 0.5x,因此 A 执行周期数为2*0.25x+0.75x=1.25x
  • CPU B 相比CPU A少了0.25x的比较指令,所以总指令数为 0.75x,其中转移指令 0.25x,其它指令 0.5x。所以B 执行周期数 2*0.25x+0.5x=1x
  • 当 CPU A 频率为 1.2 倍时,性能是 CPU B 的 1.2/1.25=0.96 倍
    当 CPU A 频率为 1.1 倍时,性能是 CPU B 的 1.1/1.25=0.88 倍
    因此 CPU A 两种情况下都差

第五章

  1. 假定某RISC处理器采用如下图所示的5级流水线(IF/ID/EX/MEM/WB)结构,对于下列指令序列:

    LW  R1,0(R0)    ; 从地址0+R0处读值到R1中
    LW  R2,4(R0)    ; 从地址4+R0处读值到R2中
    ADD R3,R1,R2    ; R3 = R1 + R2
    SW  R3,12(R0)   ; 将12+R0地址处的值存入R3
    LW  R4,8(R0)    ;
    ADD R5,R1,R4    ;
    SW  R5,16(R0)
    // *********必错点,重命名,重排序,指令地址
    指令相关(前后相同的寄存器):R1在1,3,8存在指令相关R2在2,3存在指令相关R3在3,4存在指令相关R4在5,6存在指令相关R5在6,7存在指令相关
    

    分析上述指令序列的相关,并重排序执行序列避免相关,重排序指令序列,可以比原先指令序列的执行减少多少拍?

    1. 采用五级静态流水线,即取指IF、译码ID、执行EX、访存MEM、写回WB,那么如果不发生堵塞,将执行 (5+指令数-1 = 4+指令数)的拍数。(ALU只能使用寄存器进行运算,所以需要先从内存中取得寄存器的值,在运算后再将结果存入到内存中)

    2. 如果发生指令相关的冲突,则需要进行延迟,程序计数器PC(取指)和指令寄存器IR(译码)将保持当前值不变,共执行(4+指令数+延迟拍数)的拍数

    3. 前递技术|旁路技术:
      指令阻塞会引起流水线效率降低,当前后指令存在数据相关时,流水线中的运算器通过多路选择直接把前面的指令的运算输出作为后面指令的输入 ,即前面的指令直接将运算结果传给后面的指令,从而减少后面指令的等待。

    4. 完全前递forward

      • EX执行结果到ID译码(同一拍的执行EX可以前递给译码ID)
      • WEW访存结果到ID译码
      • 写回WB结果要到ID译码
      • 其中,需要结果的指令阻塞在ID,下一拍指令被阻塞在IF(同一时间内,五级流水中的一级不能存在两条指令)
      • 运算操作在EX即可前递,LW操作在MEM才可前递(EX阶段没有值,访存MEM才获取值)
    5. 指令相关

      • 寄存器相关

        • 数据相关
        • 名字相关
      • 控制相关
    6. 只使用前递技术处理写后读的数据相关的原因

      • 分支指令由单发射五级流水译码级处理了
      • MIPS指令有延迟槽时候,控制相关不需要处理
      • 读后写和写后写相关不会触发流水线冲突,不会引起阻塞
    7. 指令的相关性(指令的相关判断和阻塞控制都是在译码级进行的)

      • 先读后读:实际上没有相关性,调转执行顺序对结果没有影响
      • 先写后读:存在数据依赖性,不可调序,称为数据相关。(可以使用前递技术)
      • 先读后写:不可调序,称为反相关
      • 先写后写:不可调序,称为伪相关
      • 控制相关:指令执行依赖于前面的控制指令结果
    8. MIPS指令基础

      https://blog.csdn.net/zhang_danf/article/details/20037329?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164048538616780264048507%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164048538616780264048507&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-20037329.pc_search_result_control_group&utm_term=LW%09R1%2C0%28R0%29&spm=1018.2226.3001.4187


    原题:在写回级没有forward通路,运算需要的两个源寄存器需要同时进行前递,因为图中的译码ID电路没有触发器进行存储

    新题:认为具有完全前递情况下,发生指令相关冲突:总拍数 = 4+指令数+延迟拍数 = 4+7+2 = 13

    • LW指令在MEM时,才取到值可以进行前递,其他运算指令在EX阶段即可前递
    • 重排策略:只与前面有关的向后调,只与后面有关的向前调,无关指令可以灵活调。一般调LW和SD
      画出五级流水,将指令代入进行思考,再画出时空图

第六章

  1. 以下这个循环是高斯消元法中的核心操作,称为DAXPY循环(双精度的a乘以X再加上Y),以下代码实现了对长度为100的向量进行DAXPY操作:Y=a∗X+YY = a*X+YY=a∗X+Y。

    bar:LDC1 F2,0(R1)    ;取数MUL.D    F4,F2,FO    ;乘法操作a * X(i)LDC1   F6,0(R2)    ;取数Y(i)ADD.D    F6,F4,F6    ;加法操作a*X(i)SDC1 F6,0(R2)    ;存数Y(i),F6寄存器的值存入R2指向的内存单元DADDIU R1,R1,#8    ;#8表示立即数,R1+8表示下标+1,一个双精度数8字节DADDIU   R2,R2,#8    ;Y的下标+1DSGTUI  R3,R1,#800  ;测试循环是否结束,注意800BEQZ  R3,bar      ;如果循环没有结束,转移到barNOP
    

    在单发射静态流水线上,假定浮点流水线的延迟如下表所示(延迟为N表示第T拍操作数准备好开始运算,第T+N-1拍可以写回结果),分支指令在译码阶段(ID)计算结果,采用了分支延迟槽技术,整数操作在一拍之内发射和完成,并且结果是完全旁路的(fully bypassed)。浮点流水线的延迟表:

    产生结果的指令 使用结果的指令 延迟(时钟周期)
    FP ALU op Another FP ALU op 4(计算后再计算需要4个延迟槽)
    FP ALU op Store double 3
    Load double FP ALU op 2(加载后再计算需要2个延迟槽)
    Load double Store double 1
    • 把这个循环展开足够的次数,要求消除所有停顿周期和循环开销指令。循环将会被展开多少次?写出调度后的代码,每产生一个结果需要多少执行时间?
    • 写出DAXPY循环在软件流水后的代码,可以省略软件流水的装入代码和排空代码,每产生一个结果需要多少执行时间?

题1相关基础知识

  1. 考试一般不会展开四次以上或者除不尽,循环展开需要对寄存器重命名,最后进行重排序减少指令阻塞

  2. 静态指令调度可以大大减少平均每次循环计算的时钟周期,主要方法:

    • 循环展开:可以降低循环开销,但是增加代码空间,降低cache的命中率
    • 寄存器重命名:可以消除WAW和WAR相关,但需要更多的寄存器
    • 指令重排序:可以消除数据相关
  3. 每次循环最后的延迟槽NOP可以放一条指令,不受转移指令影响肯定会执行,通常是SD指令( 向内存写值 )

  4. 每次循环展开,计算内存地址变换一个元素的内存长度(Double为8字节)

  5. 在64位CPU上,LDC1 是 L . D 的别名

  6. 指令 功能 应用实例
    LB 从存储器中读取一个字节的数据到寄存器中 LB R1, 0(R2)
    LH 从存储器中读取半个字的数据到寄存器中 LH R1, 0(R2)
    LW/LWC1 R2+0指向的内存单元的一个字加载到R1中 LW R1, 0(R2)
    LD 从存储器中读取双字的数据到寄存器中 LD R1, 0(R2)
    L . S 从存储器中读取单精度浮点数到寄存器中 L.S R1, 0(R2)
    L . D/LDC1 从存储器中读取双精度浮点数到寄存器中 L.D R1, 0(R2)
    SB 把一个字节的数据从寄存器存储到存储器中 SB R1, 0(R2)
    SH 把半个字节的数据从寄存器存储到存储器中 SH R1,0(R2)
    SW 把一个字的数据从寄存器存储到存储器中 SW R1, 0(R2)
    SD 把两个字节的数据从寄存器存储到存储器中 SD R1, 0(R2)
    S . S 把单精度浮点数从寄存器存储到存储器中 S.S R1, 0(R2)
    S . D 把双精度数据从存储器存储到存储器中 S.D R1, 0(R2)
    DADDIU R2+立即数k后存入R1 DADDIU R1,R2,#k
  7. 定点寄存器R1存储初始计算元素数组的最后一个元素的起始下标,每计算一个元素,下标-8(一个双精度浮点数占8个字节)后计算下一个元素

  8. 易错点

    • 寄存器的重命名
    • 展开后寄存器的offset
    • 排序号的寄存器offset,特别是非展开的指令

学长解释:https://blog.csdn.net/csdn_muxin/article/details/112284481?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164051627316780357256181%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=164051627316780357256181&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-3-112284481.nonecase&utm_term=%E5%9B%BD%E7%A7%91%E5%A4%A7%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84&spm=1018.2226.3001.4450

题1解答:假设R1、R2存放数组X、Y的首地址,F0 存储浮点常量a的值

  1. 先进行循环展开(不需要写在答题卡上,写完检查 **偏移 **和 重命名
bar:// 不要忘记展开后的地址和最后的ADDIU为展开次数*81  L.D    F2, 0(R1)    // 取X[i]2  L.D    F3, 8(R1)     // 取X[i+1] ,注意偏移值offset为8和寄存器重命名3  MUL.D  F4, F2, F0    // 计算a*X[i]4  MUL.D  F5, F3, F0     // 计算a*X[i+1]5  L.D    F6, 0(R2)       // 取Y[i]6  L.D    F7, 8(R2)         // 取Y[i+1]7  ADD.D  F6, F4, F6     // a*X[i] + Y[i]8  ADD.D  F7, F5, F6   // a*X[i+1] + Y[i+1]9  S.D    0(R2), F6      // 存Y[i]10 S.D    8(R2), F7         // 存Y[i+1]11 DADDIU R1, R1, #16    // X的下标+2,注意展开的循环次数,offset为次数*8bit12 DADDIU R2, R2, #16  // Y的下标+213 DSGEIU R3, R1, #800    // 测试循环是否结束14 BEQZ   R3, bar        // 如果循环没有结束,程序跳转到bar位置15 NOP // 在循环结束指令之后会有一条NOP,每次循环执行完会执行,可以使用其他指令进行填充
  1. 检查相关性(从题中表得知的,不需要写在答题卡上)

    1 和 3 延迟为2,不需要等待,1执行完进行前递,3正好进入译码阶段
    2 和 4 延迟为2,不需要等待
    3 和 7 延迟为4,不需要等待
    4 和 8 延迟为4,不需要等待
    5 和 7 延迟为2,不需要等待
    6 和 8 延迟为2,不需要等待
    7 和 9 延迟为2,不需要等待
    8 和 10 延迟为3,之间需要加上 1 条不相关指令
    9 和 11 延迟为3,之间需要加上 1 条不相关指令

  2. 指令重排序(必错点:1.重命名 2.偏移地址 3.控制部分的偏移)

    bar:1  L.D    F2, 0(R1)      // 取X[i]2  L.D    F3, 8(R1)     // 取X[i+1] ,注意偏移值offset为8和寄存器重命名********3  MUL.D  F4, F2, F0    // 计算a*X[i]4  MUL.D  F5, F3, F0     // 计算a*X[i+1]5  L.D    F6, 0(R2)       // 取Y[i]6  L.D    F7, 8(R2)         // 取Y[i+1]7  ADD.D  F6, F4, F6     // a*X[i] + Y[i]8  ADD.D  F7, F5, F6   // a*X[i+1] + Y[i+1]9   DADDIU R1, R1, #16   // X的下标+2,注意展开的循环次数,offset为次数*8bit10  S.D    0(R2), F6   // 存Y[i]11 S.D    8(R2), F6         // 存Y[i+1]  12 DSGEIU R3, R1, #800     // 测试循环是否结束13 BEQZ   R3, bar        // 如果循环没有结束,程序跳转到bar位置14 DADDIU R2, R2, #16  // Y的下标+2,nop指令在每次执行完一定执行
    

题2相关基础知识

  1. 软流水是通过重组循环体使得不同循环体指令并行执行,新循环体的每个操作来自不同轮的循环,以分开数据相关的指令。
  2. 软流水后,循环体会变成装入、主体循环、排空三个部分。
  3. 在软流水后循环执行时,主要是主体循环部分在执行,装入和排空仅执行一次。其中,装入是为了让主体循环可以正确执行的预处理阶段,排空是保证主体循环执行后结果正确的收尾阶段。

学长解释:https://blog.csdn.net/csdn_muxin/article/details/114491152


题2解答:指令如下,进行软流水处理。

  1. 据指令相关性进行逆序划分,写出从0开始的连续n轮循环体(地址+8,从地址从n开始则-8)(与ADDIU符号相反)
  2. 从最后一轮开始,取最后一个或多个,依次向上取得到计算指令,再加上控制指令得到循环主体
  3. 装入代码是倒序剩下的后几轮的指令序列,排空代码倒序剩下的前几轮代码
  4. 调整地址(指令间的顺序和地址差值不变),装入代码从0开始,结尾是ADDIU (正负号和题中的ADDIU相同)(n+1)*8,循环和排空的第一个地址和装入代码的最后一个是相反(指令间的顺序和地址差值不变)

主循环体代码:

S.D   -24(R2),F6 ; 第i-3 次循环的5
ADD.D   F6, F4, F8 ; 第i-2 次循环的4
MUL.D   F4, F2, F0 ; 第i-1 次循环的2
L.D     F8, -8(R2) ;// 答案不一样,这个对了
L.D     F2, 0(R1) ;
DADDUI  R1, R1, #8 ;
DSGTUI  R3, R1, #800 ;
BEQZ    R3, bar ;
DADDUI  R2, R2, #8 ;
- 9拍处理一个元素

  1. 假设有一个如上题浮点流水线的延迟表所示的支持精确例外处理的浮点流水线,流水线分成发射、执行并写回以及提交三个阶段,其中浮点加法部件延迟为2拍(即假设第T拍操作数准备好开始运算,第T+1拍可以写回结果),浮点乘法部件(可计算除法指令)延迟为3拍,浮点操作队列中已有图中所示的指令,且寄存器的初值如下图所示,请给出6拍内每一拍的寄存器以及结果总线值的变化。

  1. 浮点寄存器

    • 每一行代表相应的寄存器,eg:0表示F0寄存器
    • 第一列:最新值所在的ROB编号,待相应ROB写回即可删除
    • 第二列:寄存器内当前的值
  2. 保留站(乱序执行)
    • 第一列:指令运算结束后要将值写入的ROB编号
    • 第二列:指令操作码(指令名)
    • 第三列:指令所等待数据的ROB编号,0表示数据已准备好(有数据相关了,需要前面指令运行结果)
    • 第四列:源操作数的数据值,没计算出时为空
    • eg:DIV F1 F2 F3,第三四列表示F2值的情况,第四五列表示F3值的情况
    • 作用:将有序提交的指令,乱序执行,提高执行效率
  3. ROB(有序提交)
    • 每一行表示ROB的缓存
    • 第一列:指令操作码(指令名)
    • 第二列:指令结果要存入的目标寄存器
    • 第三列:指令运算结果
    • Tip:ROB内顺序与指令队列的顺序相同
    • 作用:按指令顺序缓存乱序执行的结果,有序写回寄存器,保证执行正确性

处理例外,要保证发生异常的指令之前的全部做完了,发生异常之后的指令全部没做,然后进行指令现场的保留,例外处理完成后再返回到相应指令继续执行 。执行结果不立即写回寄存器,而是写入一个缓存器ROB,进行有序提交到寄存器中,即确定前面指令不发生例外了,再写入寄存器


指令序列发射到保留站,然后源操作数均ready后执行,存在完全前递,浮点寄存器和ROB
从执行开始计算延迟,加法部件2拍(包括执行),乘除法部件3拍(包括执行),

第七章

  1. 假设流水线延迟如下表所示,分支延迟为1个周期,没有延迟槽。

    产生结果的指令 使用结果的指令 延迟(时钟周期)
    FP ALU op Another FP ALU op 4(计算—计算需要4个延迟槽)
    FP ALU op Store double 3
    Load double FP ALU op 2(加载—计算需要2个延迟槽)
    Load double Store double 1

    下面循环计算Y[ i ] = a * X[ i ] + Y[ i ]高斯消元法中的关键一步

    L: LDC1    F4,0(R2) ; 读Y[i]LDC1    F0,0(R1) ; 读X[i]MUL.D   F0,F0,F2 ; 求a*X[i],F2是逻辑寄存器ADD.D F0,F0,F4 ; 求a*X[i]+Y[i]SDC1    F0,0(R2) ; 保存Y[i]DADDIU R2,R2,-8DADDIU  R1,R1,-8BNEZ    R1,LNOP
    
    • 假设目标机器的流水线是单发射的,将次循环展开足够的次数,使得代码执行没有不必要的延迟,写出调度后的代码并计算一个元素的执行时间
    • 假设目标机器的流水线是双发射的,将次循环展开足够的次数,使得代码执行没有不必要的延迟,写出调度后的代码并计算一个元素的执行时间
    • 自己写一段与题中类似的C代码,用gcc的不同优化编译选项编译后,查看汇编代码,对不同优化选项进行比较,描述gcc做的优化
    1. 循环展开两次(写出来)

    1. 取值和译码双发射,执行阶段定点和浮点各一条

    1. gcc -O0 不进行优化,-O1, -O2, 进行部分优化,但是不进行循环展开优化。-O3 进行所有的
      优化,包括循环展开,对该程序非常有效。
    int main(){int i;for(i = 100; i >= 0; i--)Y[i] = a*X[i] + Y[i];return 0;
    }
    
  2. 一个n发射的处理器,流水线情况如下:取指,译码,重命名到物理寄存器后送入发射队列,发射队列乱序发射,功能部件乱序执行,乱序写回物理寄存器,最后顺序提交并释放物理寄存器。已知该处理器有m个逻辑寄存器,i个功能部件(i > n),每条指令从重命名到写回需要t1拍,从重命名到提交需要t2拍。为了能让流水线满负荷工作,最少需要多少个物理寄存器?(提示:并不是每个参数都有用)

让流水线满负荷工作,物理寄存器个数≥发射数量∗从重命名到提交的拍数+逻辑寄存器=n∗t2+m物理寄存器个数 \ge 发射数量*从重命名到提交的拍数 + 逻辑寄存器=n*t_2+m物理寄存器个数≥发射数量∗从重命名到提交的拍数+逻辑寄存器=n∗t2​+m

解释:每条指令在重命名的时候需要占用一个物理寄存器,每拍n 条指令发射,则需要占用 n 个物理寄存器。

  • 被重命名的物理寄存器只有在提交的时候,并且不是当前逻辑寄存器的时候,才被释放。

从重命名到提交共有 t2 拍,当流水线满负荷工作,流水线占用了 n*t2 个物理寄存器,另外逻辑寄存器数目为 m 个,因此共需要物理寄存器的个数为 n*t2+m

第八章

  1. 下表是转移预测的Yeh和Patt分类中根据转移历史表(BHT)和模式历史表(PHT)的不同组合形成的转移猜测种类。PC中用来索引BHT表的位数为低6位,索引PHT表的位数为低8位,BHT表每项9位,请画出SAs转移预测的结构图,说明其基本原理,并计算该结果使用的存储单元位数。下面是转移猜测不同组合的表
Global PHT Per address PHT Per setPHT
Global BHR GAg Gap GAs
Per-address BHR PAg PAp PAs
Per-set BHR SAg SAp SAs
  • 基本预测原理
    根据单条转移指令的转移历史来预测该指令未来的跳转方向和目标,对于重复性高的指令性能好

  • 转移历史表BHT(Branch History Table)
    记录每条转移指令的历史,每次进行转移预测时,使用BHT表的内容进行判断转移方向

  • 转移模式历史表PHT(Pattern History Table)
    是一种简单的BHT表。利用PC的低位索引,每项1位,记录同一项上次转移是否成功,1表示转移成功,0表示转移不成功。

  • 两位饱和计数器的PHT表:

    • 原因:为避免双重循环在外层循环进入和退出时猜错,引入每项两位的PHT表。;
    • 相应的转移指令每转移成功就加1(加到3为止),转移不成功就减1(减到0为止)
    • 转移预测时,如果两个二进制位的高位为1则预测跳转,高位为0则不跳转
    • 大量实验表明,n位预测效果和两位预测效果差不多
  • 转移历史寄存器BHR的组织方式

    • GA:global address BHR,所有转移指令共用一个BHR
    • SA:set address BHR,用PC地位索引的BHR表
    • PA:per address BHR,每条转移指令都有自己的BHR,用PC索引
  • PHT表的组织方式(p和s画出来一样?)

    • g为global,只用BHR表索引PHT表
    • s为set,表示用PC和历史记录一起索引PHT表
    • p为per-address,表示用PC和BHR表一起索引PHT表


转移历史表BHT(Branch History Table):
• 用PC的低位索引,每项1位 (可能两条转移指令的PC低位相同 ,从⽽引起冲突)
• 记录同一项上次转移是否成功,表示是否转移成功
(具有上述两项特征的BHT表,1位,称为PHT表)
• 不进行地址比较检查(cache,tag用于地址比较检查)(因为即使预测错误也还有纠正措施)

原文链接:https://blog.csdn.net/weixin_44849403/article/details/104069795


见上图

BHT为26∗9=576b2^6*9=576b26∗9=576b,PHT为28∗29∗2=262144b2^8*2^9*2 = 262144b28∗29∗2=262144b,共262720b(PHT有两位饱和计数所以是*2)
基本原理:BHT根据地址低6位选出一个9位向量,和地址低8位一起到PHT中选取2位饱和计数。

  1. 假设流水线延迟如下表所示,分支延迟为1个周期,有延迟槽。
产生结果的指令 使用结果的指令 延迟(时钟周期)
FP ALU op Another FP ALU op 4(计算—计算需要4个延迟槽)
FP ALU op Store double 3
Load double FP ALU op 2(加载—计算需要2个延迟槽)
Load double Store double 1
  • 下面程序段实现对数组元素增值,R1和R2的初始值满足R1 = 8n+R2,n为循环次数。

    L1: LDC1    F0,0(R1)ADD.D   F2,F0,F1SDC1    F2,0(R1)ADDIU   R1,R1,-8BNE     R1,R2,L1NOP
    

    写出完整的软件流水循环代码,包括装入代码和排空代码,并计算软件流水循环完成所有操作所需要的总时钟周期数表达式。

  • 分析比较软件流水和循环展开两种方案的区别

  1. 第一问
//装入代码LDC1    F0,0(R1)ADD.D   F2,F0,F1LDC1    F0,-8(R1)ADDIU  R1,R1,-24   //?-24影响了下面寄存器的地址
// 主题循环
L1: SDC1    F2,24(R1)   // loop i-2ADD.D        F2,F0,F1    // loop i-1LDC1     F0,8(R1)    // loop i,主体循环最后一个LD与展开的最后一个循环的第一个LD的地址相同BNE     R1,R2,L1    //两个寄存器内容不等时,转移到L1ADDIU      R1,R1,-8    // 填充NOP指令
// 排空代码SDC1     F2,24(R1)ADD.D      F2,F0,F1SDC1        F2,16(R1)

总的指令周期数 = 装入 + 循环 + 排空 = (1+2+1+1)+(5*(n-2) )+(1+3+1) = 5n // 看延迟表可知2和3含义

  1. 软流水无法降低分支频率,但代码量增加少
    循环展开可以降低分支频率,但会带来代码膨胀和逻辑寄存器不足的问题

第九章

  1. 假设每个“非门”,“与非门”,“或非门”,的扇入不超过4个且每个门的延迟为T,请给出使用如下不同算法的16位加法器的延迟

    • 串行进位加法器
    • 先行进位加法器
    • 说明为何先行进位加法器比串行进位加法器快

一般电路内反逻辑比正逻辑更快

  1. 串行进位加法器(将1bit的全加器串成一个链)

    • 每一级进位传递的延迟为2T,因此生成c16需要(2*15T+2T)= 32T
    • 最后一级产生结果的延迟为3T,因此生成s15需要(2*15T+3T)= 33T

  2. 先行进位加法器

  • 组内并行,组间并行,4位一组
    延迟共2T(并行计算的进位输入p,g?)+ 2T(红,产生每组P,G) + 2T(蓝,产生组间进位) +2T(绿,产生组内进位) + 3T(全加器逻辑,进位完成后的求和 ) = 11T

  1. 先行进位加法器快的原因:能更快的生成第i位的c而不需要依赖第i-1位的c
  1. 假设每个“非门”,“与非门”,“或非门”,的扇入不超过4个且每个门的延迟为T,请给出使用如下不同算法的把4个16位数相加的延迟

    • 使用多个先行进位加法器
    • 使用加法树及先行进位加法器
  • 16位先行进位加法器的延迟为11T
  • 全加器的延迟为3T(将三个数相加转化为两个数相加)
  1. 使用多个加法器,采用先行进位加法器两两相加,需要2*11T = 22T延迟

  2. 使用加法树及加法器

    使用加法树把四个数相加变成两个数相加,需要2级全加器延迟(6T),然后再使用先行进位加法器(11T)得到最后结果,因此共6T+11T = 17T延迟

  1. 用Verilog写一个16位的先行进位加法器 所描述的电路图,点我!!
module C4(p,g,cin,P,G,cout) // C4表示右上角的逻辑图input  [3:0]   p,g;input           cin;output          P,G;output  [2:0]   cout;assign     P=&p;// 每项最后一位的规律g[3] g[2] g[1] g[0] cinassign     G=g[3]|(p[3]&g[2])|(p[3]&p[2]&g[1])|(p[3]&p[2]&p[1]&g[0]);// 线进行逻辑运算产生Gassign  cout[0]=g[0]|(p[0]&cin);assign     cout[1]=g[1]|(p[1]&g[0])|(p[1]&p[0]&cin);assign    cout[2]=g[2]|(p[2]&g[1])|(p[2]&p[1]&g[0])|(p[2]&p[1]&p[0]&cin);
endmodulemodule add16(a,b,cin,out,cout);input   [15:0]  a;input [15:0]  b;input         cin;output  [15:0]  out;output          cout;wire[15:0]p = a|b;wire[15:0]g = a&b;wire[15:0]   c;wire[3:0] P,G;assign c[0] = cin;// 描述块间和块内均并行的16位先行进位逻辑图C4 C0_3(.p(p[3:0]),.g(g[3:0]),.cin(c[0]),.P(P[0]),.G(G[0]),.cout(c[3:1]))C4 C4_7(.p(p[7:4]),.g(g[7:4]),.cin(c[4]),.P(P[1]),.G(G[1]),.cout(c[7:5))C4 C8_11(.p(p[11:8]),.g(g[11:8]),.cin(c[8]),.P(P[2]),.G(G[2]),.cout(c[11:9]));C4 C12_15(.p(p[15:12]),.g(g[15 :12]),.cin(c[12]),.P(P[3]),.G(G[3]),.cout(c[15:13));C4 C_INTER(.p(P),.g(G),.cin(c[0]),.P(),.G(),.cout({c[12],c[8],c[4]}));                  assign cout = (a[15]&b[15]) | (a[15]&c[15]) |(b[15]&c[15])assign out = (~a&~b&c)|(~a&b&~c)|(a&~b&~c)|(a&b&c);
endmodule

第十章

  1. 一个处理器的页大小为4KB,一级数据cache的大小为64KB,cache块大小 为32B,指出再直接相联,二路组相联,以及4路组相联的情况下需要页着色(page coloring)的地址位数和Tag的大小(必换数考)
  • 为什么要也页着色?
    一路的容量比一页大,可能出现多个逻辑页映射到同一个物理页,而出现别名问题(索引错误),所以要将多的高位索引位(页外地址位)进行着色(标识不使用?)

  • (自己画个图)若组相连路数为2n,cache块大小位数为2c,页大小为2y,一级数据cache大小2s
    索引数据结构 = cache总大小s位 = 组相连n位 + 页着色y位 + 页内大小y位(index为y-c位,offset为c位)


页大小为4KB=212 B ,页内地址为 [11 : 0]
cache块大小32B = 25B,地址范围为[4 : 0]
cache容量 64KB=216 B ,地址范围为 [15: 0]
cache块大小为 32B=25 B ,地址范围为 [4:0]

  • 直接相联(0路组相联)
    cache索引位数为地址的 [15: 5],需要页着色的是地址 [15: 12],共 4 位;
  • 二路组相联(21,组相联位数为1)
    cache索引位数为地址的 [14: 5],需要页着色的是地址 [14: 12],共 3 位;
  • 四路组相联(22,组相联位数为2)
    cache索引位数为地址的 [13: 5],需要页着色的是地址 [13: 12],共 2 位。

在32位处理器中,如果cache大小为64KB(216),块大小为32字节,则Offset为5位,共211个cache块

  • 全相联的cache结构Index为0位,Tag为27位
  • 直接相连的Index为11位,Tag为16位
  • 二路组相联的index为10位,Tag为17位
  • 4路组相联的index为9位,Tag为18位

第十一章

  1. 在一台运行Linux操作系统(页大小为4KB)的MIPS计算机上执行如下C语言程序。在该程序执行过程中共发生了多少次例外?说明其过程。(必)

    void cycle(double *a){int i;double b[65536];for(i = 0; i < 3; i++)memcpy(a,b,sizeof(b));
    }
    
  • TLB是一个页表的cache
  • MIPS计算机表示TLB的维护和替换都给软件处理,其他计算机cache对由硬件处理
  • 一项存两个页的映射关系
  • invalid例外和TLB项数无关
  • memory copy表示地址不重叠
  • MIPS计算机3种例外的触发条件
    • TLB Refill例外:TLB不命中(即发生替换的次数)
    • TLB invalid例外:TLB命中,但是表项内标识位 v = 0,后面会找到有效的物理页表项后回填
    • TLB modify 例外:触发TLB invalid例外回填时间,dirty置位,所以这页不会单独触发本例外

前言:
题目中没有给 TLB 项数和替换算法,参考答案按项数足够计算,但各位同学需要掌握项数不足情况的计算公式。题目中没有考虑 modify 例外和 a 数组已在父函数进行过访问的情况,题干不是很严谨。


解答:

  • 操作系统页大小为4KB,同时系统的物理内存足够大,即页表分配的物理内存在程序执行过程中不会被交换到swap区上。并且在后续的分析中忽略代码和局部变量i所在的页的影响。
  • a和b数组大小均为65536*8 = 512KB。再假设a和b两个数组的起始位置恰为一页的起始地址。那么a和b两数组各自均需要512KB/4KB = 128个页表项。所以,a和b的访问造成TLB invalid 例外次数为128 + 128 = 256次。
  • 假设TLB页表项为128项,每项映射连续的偶数和奇数两个页,采用LRU算法,那么第一次循环中,a和b两个数组每访问相邻的两页首地址,均会触发一次TLB refill例外,所以所有循环共触发的TLB refill例外次数为128/2 + 128/2 =128次
  1. 假定在一个CPU的cache中需要64位虚拟地址,8位的进程标识,而其支持的物理内存最多有64GB。请问,使用虚拟地址索引比使用物理地址作为索引的Tag大多少?这个值是否随着cache块大小的变化而变化?
  1. 由于虚拟地址有 64 位,进程标识为 8 位;而物理地址是 64GB ,即需要 36 位物理地址。这样,使用虚拟地址比使用物理地址总共增加的位数为 8+64-36 = 8+28=36 位 。
  2. 改变块的大小, 亦或改变 cache 的其它参数, cache 占据的地址的低位的长度对于虚地址索引和物理地址索引都是一样的,所以对于 cache 的 tag 而言,两种索引方式相差位数保持不变 。
  1. 已知一台计算机的虚地址为48位,物理地址为40位,页大小为16KB,TLB为64项全相联,TLB的每项包括一个虚页号vpn,一个物理页号pfn,以及就一个有效位valid,请根据如下模块接口写出一个TLB的地址查找部分的Verilog代码。module tlb_cam(vpn_in,pfb_out,hit,···);
    其中,vpn_in为输入的虚页号,pfn_out为输出物理页号,hit为表示是否找到输出信号,“···”表示该TLB输入输出有关的其他信号。重复的代码可以用“···”来简化,如:

    assign   A[0] = B[0]|C[0];···
    assign  A[63] = B[63]|C[63];
    
// vpn_in用于查找的虚地址,hit输出是否命中的信息,pfn_out查找命中得到的物理页号,valid_out页表项的v位
module tlb_cam(vpn_in,pfn_out,hit,valid_out);input  [33:0]  vpn_in;output   [25:0]  pfn_out;output  hit;output  valid_out;// 输入的vpn与页表项的v位进行比较reg[60:0] cam_content[63:0]; // [60:60]最高位放valid,[59:34]pfn,[33:0]vpnwire[63:0] entry_hit;assign    entry_hit[0] = (vpn_in == cam_content[0][33:0]);aasign   entry_hit[1] = (vpn_in == cam_content[1][33:0]);······assign     entry_hit[63] = (vpn_in == cam_content[63][33:0]);assign hit = |entry_hit;// 有一个命中即命中,按位或,hit = 0即触发refail例外// 多路选择器,其中按位与比按位或的优先级高assign pfn_out =   {26{entry_hit[0]}} & cam_content[0][59:34] |{26{entry_hit[1]}} & cam_content[1][59:34] |·······{26{entry_hit[63]}} & cam_content[63][59:34];// hit = 1且valid_out = 0触发invalid例外assign    valid_out =      entry_hit[0] && cam_content[0][60] ||entry_hit[1] && cam_content[1][60] ||    ···entry_hit[63] && cam_content[63][60];
endmodule

第十二章

  1. 假设在一个双CPU多处理器系统中,两个CPU用单总线连接,并且采用监听一致性协议(MSI),cache的初始状态均为无效,然后两个CPU对内存中同一数据块进行如下操作;CPU A读,CPU A写,CPU B写,CPU A读,写出每次访问后两个CPU各自的cache的状态变化
  • 在MSI协议中,缓存中包含的每个块可能处于以下三种状态之一

    • Modified(已修改):块已在缓存中已被修改,缓存中的数据与后备存储器(例如内存)中的数据不一致。具有“M”状态的块的缓存在该块被替换时需要将其中的内容写回后备存储。
    • Shared(共享):块未被修改,并在至少一个处理器的缓存中以只读状态存在。高速缓存可以将其替换而不将其中的数据写回后备存储。
    • Invalid(无效):该块不存在于当前缓存中,或者因为总线请求而被标记为无效。如果要将某个块存储在该缓存中,则必须首先从内存或另一个高速缓存中获取该块。
  • 做题技巧

    • 不细分E和M状态,写操作完成一定是modified状态(写操作要独占避免读脏数据)
    • 两个CPU共用,一个是M状态,另一个一定是 I状态
    • 如果自己是M,若另一个人读则自己转换为S
  • 状态转换机


事件 A状态 B状态
初始 I I
CPU A读 S I
CPU A写 M I
CPU B写 I M
CPU A读 S S

CPU B写,CPU A读,写出每次访问后两个CPU各自的cache的状态变化

  • 在MSI协议中,缓存中包含的每个块可能处于以下三种状态之一

    • Modified(已修改):块已在缓存中已被修改,缓存中的数据与后备存储器(例如内存)中的数据不一致。具有“M”状态的块的缓存在该块被替换时需要将其中的内容写回后备存储。
    • Shared(共享):块未被修改,并在至少一个处理器的缓存中以只读状态存在。高速缓存可以将其替换而不将其中的数据写回后备存储。
    • Invalid(无效):该块不存在于当前缓存中,或者因为总线请求而被标记为无效。如果要将某个块存储在该缓存中,则必须首先从内存或另一个高速缓存中获取该块。
  • 做题技巧

    • 不细分E和M状态,写操作完成一定是modified状态(写操作要独占避免读脏数据)
    • 两个CPU共用,一个是M状态,另一个一定是 I状态
    • 如果自己是M,若另一个人读则自己转换为S
  • 状态转换机

    [外链图片转存中…(img-R3FcAYqs-1641868153915)]


事件 A状态 B状态
初始 I I
CPU A读 S I
CPU A写 M I
CPU B写 I M
CPU A读 S S

国科大计算机体系结构考试专用相关推荐

  1. 国科大计算机体系结构习题整理

    横线上方为基础知识和解题思路,横线下方为具体题目解答 学习效率最高的是:基于考试题的课堂视频片段的回放(我悟了) 不是只考划的,有时间把所有习题都做做吧 gitee图床的外链挂了,但是不影响整体阅读, ...

  2. 用计算机控制人造卫星和导弹的发射属于,2008年6月全国高校计算机等级考试(广西考区)一级笔试试题卷...

    2008年6月全国高校计算机等级考试(广西考区)一级笔试试题卷 全国高校计算机等级考试(广西考区)一级笔试试题卷 2008年6月28日 闭卷考试 考试时间60分钟 第一部分:基础知识(26项,每项1. ...

  3. 医学专业考计算机三级,2020年9月中国医科大学计算机等级考试报名通知

    [导语]2020年9月全国计算机等级考试报名工作正在进行中,为了方便广大考生及时获取报名的实时信息,下面无忧考网为您精心整理了2020年9月中国医科大学计算机等级考试报名通知 ,希望广大考生及时关注, ...

  4. 全国计算机等级考试专用辅导教程,全国计算机等级考试专用辅导教程:三级数据库技术...

    全国计算机等级考试专用辅导教程:三级数据库技术 语音 编辑 锁定 讨论 上传视频 <全国计算机等级考试专用辅导教程三级数据库技术>是2012年电子工业出版社出版的图书,作者是吴海涛. 书  ...

  5. 王牌专业,名列前茅~国科大计算机双非包容度超高

    1.院校介绍 中国科学院大学简称国科大,计算机是其王牌专业之一.国科大计算机学院联合计算技术研究所.软件研究所.自动化研究所等单位的优势科研资源,拥有一支高水平师资队伍,其研究方向主要是:多媒体信息处 ...

  6. 金国职称计算机等级考试,《全国计算机等级考试历年真题必练》全国计算机等级考试命题研究组著【摘要 书评 在线阅读】-苏宁易购图书...

    目录 2015年9月全国计算机等级考试二级Visual FoxPro数据库程序设计 试卷 试卷答案解析 *择题关键考点点评 操作题关键考点点评 2015年3月全国计算机等级考试二级Visual Fox ...

  7. 国科大计算机学院推免,电子科技大学2020届保研率17.8%,主要保研本校、国科大、北大、中科大...

    原标题:电子科技大学2020届保研率17.8%,主要保研本校.国科大.北大.中科大 电子科技大学2020届保研率17.8%,主要保研本校.国科大.北大.中科大. 1.推免比例 根据成电教务处公示,20 ...

  8. 国二计算机c 考试内容,计算机国二C语言考试试题第三套

    <计算机国二C语言考试试题第三套>由会员分享,可在线阅读,更多相关<计算机国二C语言考试试题第三套(10页珍藏版)>请在人人文库网上搜索. 1.第三套1.对下面程序描述正确的一 ...

  9. 能代表个人水平的c语言程序,求全国高等学校计算机水平考试级C程序设计的免费..._报关水平_帮考网...

    1.运行考试系统打开编程题(第三大题),软件会自动启动vc++6.0,然后在需要考生编写的函数代码里加一个分好":"其他什么都不做. 2.compile->link-> ...

最新文章

  1. linux查询首字符不是T,linux – tload输出中的不同字符是什么意思?
  2. 【Google Play】Android 应用用户协议 ( 生成用户协议 | HTML 用户协议模板 | Markdown 用户协议模板 )
  3. jmeter测试java代码
  4. 使用react、antd组件报错TypeError: _this.formRef.current.validateFields is not a function
  5. 数据结构 - 栈(链表实现栈的入栈出栈)
  6. android studio导入eclipse项目各种问题,eclipse项目导入android studio 各类问题及解决方法...
  7. mybatis plus使用雪花算法_11.雪花算法与精度丢失
  8. Jquery制作另一个炫丽广告栏-(VS2010版本)
  9. 在XCode的一个项目中创建多个C/C++/Cpp文件并分别运行——创建多个target实现
  10. 单片机----数码管(138译码器)显示日期
  11. flutter实现画中国地图
  12. ES6笔记上(深入浅出ES6—阮一峰)
  13. (java毕业设计)基于java汽车租赁管理系统源码
  14. [激光器原理与应用-10]:激光器分类
  15. 数据结构习题——第一章 绪论
  16. Electron如何修改图标
  17. 华为云计算工程师证好考吗?
  18. MySQL之存储过程及函数的使用
  19. java工具类-java仿微信九宫格头像
  20. 搜索引擎的爬虫技术研究

热门文章

  1. 带pcb板的c语言实验报告,pcb实验报告.doc
  2. Unsupervised Learning: Deep Auto-encoder
  3. Android系统换字体不root,小编吐血整理,超实用免ROOT 安卓手机换字体软件
  4. UnityException: Gizmo drawing functions can only be used in OnDrawGizmos and OnDrawGizmosSelected.
  5. java整合支付宝遇到的坑及解决方法
  6. 风场可视化:绘制轨迹
  7. 2.002 tensorflow做矩阵乘法
  8. IT经理的两条职业路做管理还是管理咨询
  9. Mysql给一个大表加一列_MySQL 大表添加一列的实现
  10. 微信图片,此图片来自微信公众平台未经允许不可引用解决方案