# Exam

## 2023 Spring

- 模式和 2022 一致，判断（15个，每个1分），单选（15个，每个1分），填空（10空，每空1分），解答（前四题每个5分，后四题每个10分）。题量略大。最后延长了15分钟。

- 4个部分中，非常多的题和 2022 Spring 是一样的。

  - Remark：判断题保留了我在考前做的时候感觉不确定的几乎所有题目 :crying_cat_face:

- 解答题

  - 互连网络（互连函数计算、级控制函数、通过级控制函数反推互连函数等等，作业做过）（5分）
  - Huffman建树、最短平均码长计算、求扩展码（作业做过）（5分）
  - 已知使用一静态多功能流水线（各段用时不全相同，加法和乘法使用不同的阶段）计算 $\prod_{i=1}^5(A_i+B_i)$ （5分） 

    - 绘制时空图
    - 计算吞吐率，加速比和效率
  - 还有一个5分题，忘记了，待补充
  - Cache 测量实验（10分）

    - 给一张 Cache 大小测量实验的图（循环访问大小为 size 的数组，图为 平均访问时间 - size 大小 的关系图），问 L1D 和 L2 Cache 应为多大

    - 给一张 Cacheline 大小测量实验图，问 Cacheline 大小是多少

    - 假设有一种新指令，其

      - 可以判断某个地址是否在 Cache 中
      - 使用后会清空 Cache
      - 有 `fence` 指令的效果

      要求利用该指令，在不计时的情况下测量 Cache 大小和 Cacheline 大小

  - Tomasulo + ROB（10分）： 和 2022 Spring 似乎完全一样

  - 软件优化（10分）：给一段代码，印象中似乎是

    ```c
    double matrix[N][M];
    double a[N], b[M];
    
    for (int i = 0; i < N; ++i) {
        for(int j = 0; j < M; ++) {
            double tmp = b[j] * matrix[i][j];
            a[i] = a[i] + tmp;
        }
    }
    ```

    对于的汇编印象中是

    ```asm
    # 寄存器的初值
    # x1: a 起始地址
    # x2: matrix 起始地址
    # x4: b 起始地址
    # x5: a 终止地址
    # x6: b 终止地址
    Loop1:
    	addi x3, x4, 0
    	
    Loop2:
    	fld  f0, 0(x1)
    	fld  f1, 0(x2)
    	fld  f2, 0(x3)
    	fmul f3, f1, f2
    	fadd f0, f0, f3
    	fsd  f0, 0(x1)
    	addi x2, x2, 8
    	addi x3, x3, 8
    	bne  x3, x6, Loop2
    	nop
    
    	addi x1, x1, 8
    	bne  x1, x5, Loop1
    	nop
    ```

    已知延迟槽中的代码必然执行，另外已知几种指令之间的延迟拍数。

    - 第一问：将两条内层循环指令外提从而减少访存次数
    - 第二问：在第一问的基础上，将代码优化到最优（不一定消去全部 `nop`）
    - 第三问：在第一问的基础上，假设 M 是 3 的倍数，将循环展开 2 次得到 3 个循环体，并将代码优化到最优（不一定消去全部 `nop`）

  - 分支预测（10分）： 2 位饱和计数器；第一问和 2022 一样，第二问就是作业中的题型，计算由于分支带来的平均停顿周期数

## 2022 Spring

2023 Update：上传了一份非官方答案，和几个0字班同学对过，但仍有一些不确定的地方（已标注）。

考前：

「大家休息吧  感觉我的考题不需要加班加点去学习. 题目难度和分数不成正比，没有任何文字游戏，没有记忆题目。只要上课听讲，不用复习. 」  by 🌕D.S. WANG

考试：（基本没有怪题）

一、判断题（30 × 1'）

（各种细碎的知识点，比如 cache 一章中的。）

（感觉绝大部分都是对的。）

二、单选题（25 × 1'）

（各种细碎的知识点，比如 cache 一章中的。也有计算。）

三、填空题

（好像都是计算）

四、解答题：

1. Cache ：物理地址中各段长度计算；比较两段程序的命中率

2. Tomasulo + ROB 填表：执行起始时间、终止时间、读存储器时间、写 CDB 时间、 commit 时间

3. 分支预测， 2 位饱和计数器；给一段程序（高级语言 + 汇编），计算缺失次数。

4. 指令系统设计

    （1）平均最短操作码

    （2）4 条“寄存器-寄存器”型， 3 条“寄存器-存储器”型……（类似“那道”填空题）
