分类: 计算机组成原理

  • COD作业3

    1

    1. PC: 取出PC,更新
      Inst Memory: 取指令
      Decode: 译码
      regfile: 取出rs1,写入rd
      ALU: 计算加法
      control: 译码
      MUX: 选择数据
    2. PC: 取出PC,更新
      Inst Memory: 取指令
      Decode: 译码
      regfile: 取出rs1, rs2
      ALU: 计算加法
      control: 译码
      Branch: 比较大小
      MUX: 选择数据
    3. (1) beq,bne,bge,blt,bgeu,bltu
      (2) lb,lh,lw,lbu,lhu
      (3) sb,sw,sh

    2

    1. T(流水线)=250ps, T(单周期)=1020ps

    2. t(流水线)= 1004\times250ps=251ns
      t(单周期)= 1000\times1020ps=1020ns
      加速比为 4.06

    3.

    Inst\cycle 1 2 3 4 5 6 7 8 9
    add x1, x1, x3 IF ID EX MEM WB
    add x2, x1, x4 IF ID EX MEM WB
    lw x3, 0(x2) IF ID EX MEM WB
    add x5, x3, x6 IF ID ID EX MEM WB

    3

    1. Inst\cycle 1 2 3 4 5 6 7 8 9 (10)
      ld x10, 0(x13) IF ID EX MEM WB IF ID
      ld x11, 8(x13) IF ID EX MEM WB IF
      add x12, x10, x11 IF ID ID EX MEM WB
      subi x13, x13, 16 IF IF ID EX MEM WB
      bnez x12, LOOP IF ID EX MEM WB
      nop IF ID
      nop IF

    每次 8 周期。

    1. 假设分支预测可以在 IF 阶段预测下一条跳转指令的位置
    Inst\cycle 1 2 3 4 5 6 7 8 9 (10)
    ld x10, 0(x13) IF ID EX MEM WB IF ID
    ld x11, 8(x13) IF ID EX MEM WB IF
    add x12, x10, x11 IF ID ID EX MEM WB
    subi x13, x13, 16 IF IF ID EX MEM WB
    bnez x12, LOOP IF ID EX MEM WB

    节约 2 个周期。

    4

    • 静态预测:向后不跳向前跳
    • 1-bit predictor: 和上一次一样
    • 2-bit Saturating Counter: 2-bit state,跳+1,不跳-1,>=2时跳,很常见
    • 对不同位置的分支分别保存几次历史
    • 保存全局的分支跳转历史,并和上一条并用
    • 对函数返回的专门优化
    • etc.
  • COD作业2

    1

    1. $CPI=50\%\times1+40\%\times2.5+10\%\times5=2$

    2. $T=\frac Nf\cdot CPI=\frac{2N}f$

    3. $CPI_2=50\%\times0.6+40\%\times2.5+10\%\times5=1.8$
      运行时间降低为原来的 90%

    4. $CPI_3=50\%\times1+40\%\times x+10\%\times5=1.8$
      $x=2$
      乘法指令的 $CPI$ 应变为 $2$
    5. $CPI_4=50\%\times1+40\%\times 2+10\%\times y=1.8$
      $y=3$
      访存指令的 $CPI$ 应变为 $3$
      需要优化 40%,而优化乘法指令仅需优化 20%

    2

    1. $x5=20$

    2. //int x6=10;
      while(x6!=0){
         x6-=1;
         acc+=2;
      }
      return;
      
    3. $4N+1$ 条

    4. 程序会多循环一次,x6 最后会停在 -1 而不是 0.

    3

    对于程序

    lb x6, 0(x7)
    sb x6, 8(x7)
    
    1. 0x11, 按照大端定义,0x10000000 存储 0x11
    2. 0x88, 按照小端定义,0x10000000 存储 0x88

    4

    参考 https://gh0st.cn/Binary-Learning/PE%E5%9F%BA%E7%A1%80.html

    PE 文件分为 DOS 部分,PE 文件头、节表、节数据 四个部分。

    DOS 部分的头部是 DOS 头,用于兼容 16 位操作系统,现已弃用。DOS 头的开头是 magic number 0x5a4d, 结尾处存储了 PE 文件头开始的位置。

    DOS 头后面是 DOS 块,是原本 16 位应用程序存放的地方,现在一般以一个打印不兼容信息的小程序填充。

    接下来是 PE 文件头。PE 文件头的头部是 magic number 0x00004550, 随后是标准 PE 头和拓展 PE 头。

    标准 PE 头存储了该程序能运行在什么机器上、编译时间、节数量、一些文件数据与调试信息、以及拓展 PE 头的大小。

    拓展 PE 头存储了很多运行时需要的信息。比较重要的有 ImageBase 存储了 PE 文件在内存中按内存对齐展开后的首地址,AddressOfEntryPoint 存储了当前程序入口的地址、对齐大小、初始堆栈大小、各个部分加载进内存后的大小等等。

    接下来是节表。节表的数量由标准 PE 头指定。节表存储了节数据在文件中的位置、在内存中的位置、加载进内存后的大小、RWX 属性等。

    接下来是节数据。一般有 .text, .data, .rdara, .rsrc 等。

    拓展 PE 头的最后存储了导入表、导出表、重定位表的位置与大小。导出表存储着该 PE 文件提供给其他人使用的函数列表。导入表则存储着该PE 文件所需要用到的 PE 文件列表。重定位表存储了该 PE 文件提供模块给其它程序时,哪些地方的程序需要重定位硬编码地址。

  • RV32I笔记

    instruction types

    R:寄存器 – 寄存器操作

    I:短立即数和访存 load

    S:访存 store

    B:条件跳转

    U:长立即数

    J:无条件跳转

    opcode

    指令不仅仅由 opcode 区分,还有子 opcode.

    主 opcode:

    R 型全是 0110011

    计算 I 型全是 0010011

    lui 是 0110111

    auipc 是 0010111

    读内存 I 型都是 0000011

    写内存型都是 0100011

    jalr 是 1100111

    jal 是 1101111

    B 型是 1100011

    细分 opcode

    12 – 14 位是细分 opcode

    R 型与计算 I 型:

    op code
    add, sub 000
    sll 001
    slt 010
    sltu 011
    xor 100
    srl, sra 101
    or 110
    and 111

    随后,sub 和 sra 和 srai 要将第 30 位置为 1,其它的此位置无立即数的是 0,有立即数的是立即数。

    ALU 操作码设计

    以上 10 个操作加上直接输出 A, B 共 12 个操作,用 4 位就够了。由于不确定透传 A, B 是否需要配合其它译码电路,先给它们两个单独划分一个位,后续再根据需求修改操作码。

    op code
    add 00000
    sub 01000
    sll 00001
    slt 00010
    sltu 00011
    xor 00100
    srl 00101
    sra 01101
    or 00110
    and 00111
    srcA 10000
    srcB 10001
  • COD作业1

    1

    (1)

    T_{p_1}=0.9\times5\times10^9\div4GHz=1.125s

    T_{p_2}=0.75\times1\times10^9\div3GHz=0.25s

    p_2 所用时长更短。

    (2)

    T=1\times10^9\times0.9\div4GHz=0.225s

    I_{p_2}=0.225s\times3GHz\div0.75=9\times10^8

    (3)

    MIPS_{p_1}=\frac{4GHz}{0.9\times10^6}=4444s^{-1}

    MIPS_{p_2}=\frac{3GHz}{0.75\times10^6}=4000s^{-1}

    p_1 的 MIPS 更高,但是按照 (1) 的结论更慢。

    (4)

    MFLOPS_{p_1}=\frac{5\times10^9\times40\%}{1.125s\times10^6}=1778s^{-1}

    MFLOPS_{p_2}=\frac{1\times10^9\times40\%}{0.25s\times10^6}=1600s^{-1}

    2

    (1)

    ALU:计算单元,执行算术运算,SOC 课讲过。

    REGFILE:寄存器单元,提供寄存器读写。

    MUX:选择器,按照控制信号连接对应的电路。

    MEMORY:内存单元,按照地址读写内容。

    (2)

    ALU,REGFILE,MUX 属于 CPU.

    MEMORY(包括 MAR,MDR)属于内存

    (3) 图中 INPUT 和 OUTPUT 使用固定内存映射进行 I/O.

    x86 计算机中显示器信号、键盘、鼠标可以使用内存映射进行 I/O. 除此之外 I/O 设备还有声卡、网卡、硬盘等。

    3

    (1)

    A B Bin D Bout
    0 0 0 0 0
    0 0 1 1 1
    0 1 0 0 1
    0 1 1 1 1
    1 0 0 0 0
    1 0 1 1 0
    1 1 0 0 0
    1 1 1 1 1

    (2) 功能:计算 A-B-Bin,结果为 D,借位 Bout,即一位全减器。

    (3)

    module Foo(A, B, Bin, D, Bout);
        input A, B, Bin;
        output D, Bout;
    
        assign D = A^B^Bin;
        assign Bout=(~A&(B|Bin))|(B&Bin);
    endmodule
    
    

    4

    (1) 不区分,PC(IP)所指位置默认皆为指令,遇到非法指令直接报错。程序应自己设置合适的跳转保证 PC(IP)所指位置皆为指令。
    按地址读取内存时全部视为数据,指令也视为对应的二进制数据。