第一章 计算机概要与技术(习题课)


CH1 习题课

教材习题

1.3 简述程序执行过程

问题:
讲述C等高级语言转化为计算机能够执行的指令的步骤。
#card
解答:
程序从高级语言(如C)到计算机可执行指令的转换过程主要包括以下几个步骤:

  1. 编译:高级语言代码被编译器转换为汇编语言代码。
  2. 汇编:汇编语言代码被汇编器转换为机器语言代码(目标文件)。
  3. 链接:目标文件与所需的库文件(如动态链接库或静态链接库)被链接器合并成一个可执行文件。
  4. 加载与执行:可执行文件被加载器加载到内存中,由CPU执行。

1.6 性能公式

问题:
一个指令集体系结构由两种不同实现。共有A、B、C、D四类指令,对实现P1(2.5GHz)来说,CPI分别为1、2、3、3;对实现P2(3GHz)来说,CPI分别为2、2、2、2。
一程序有1x10^6条指令,四类指令比例分别为10%,20%,50%,20%。

  • (1) 每种实现的总CPI分别是?
  • (2) 每种实现的时钟周期数为?
    #card
    解答:

(1) 每种实现的总CPI

计算加权平均CPI:

  • P1的总CPI

CPIP1=(0.1×1)+(0.2×2)+(0.5×3)+(0.2×3)=0.1+0.4+1.5+0.6=2.6\text{CPI}_{P1} = (0.1 \times 1) + (0.2 \times 2) + (0.5 \times 3) + (0.2 \times 3) = 0.1 + 0.4 + 1.5 + 0.6 = 2.6

  • P2的总CPI

CPIP2=(0.1×2)+(0.2×2)+(0.5×2)+(0.2×2)=0.2+0.4+1.0+0.4=2.0\text{CPI}_{P2} = (0.1 \times 2) + (0.2 \times 2) + (0.5 \times 2) + (0.2 \times 2) = 0.2 + 0.4 + 1.0 + 0.4 = 2.0

(2) 每种实现的时钟周期数

  • P1的时钟周期数

时钟周期数P1=指令数×CPIP1=1×106×2.6=2.6×106 周期\text{时钟周期数}_{P1} = \text{指令数} \times \text{CPI}_{P1} = 1 \times 10^6 \times 2.6 = 2.6 \times 10^6 \text{ 周期}

  • P2的时钟周期数

时钟周期数P2=指令数×CPIP2=1×106×2.0=2.0×106 周期\text{时钟周期数}_{P2} = \text{指令数} \times \text{CPI}_{P2} = 1 \times 10^6 \times 2.0 = 2.0 \times 10^6 \text{ 周期}


1.7 性能公式与加速比

问题:
对同一个程序,编译器A产生1x109条指令,执行时间为1.1s;编译器B产生1.2x109条指令,执行时间为1.5s。

  • (1) 若处理器时钟周期长度为1ns,求两个编译器产生程序的CPI。
  • (2) 假设两个程序在不同处理器上运行,且执行时间相同,求:运行编译器A的处理器比运行B的快多少?
  • (3) 有种新的编译器,只产生6x10^8条指令,CPI平均为1.1,求:这种新编译器相对于编译器A、B的加速比各是多少?
    #card
    解答:

(1) 求两个编译器产生程序的CPI

  • 编译器A的CPI

CPIA=执行时间×时钟频率指令数=1.1×109 ns1×109 条=1.1\text{CPI}_A = \frac{\text{执行时间} \times \text{时钟频率}}{\text{指令数}} = \frac{1.1 \times 10^9 \text{ ns}}{1 \times 10^9 \text{ 条}} = 1.1

  • 编译器B的CPI

CPIB=执行时间×时钟频率指令数=1.5×109 ns1.2×109 条=1.25\text{CPI}_B = \frac{\text{执行时间} \times \text{时钟频率}}{\text{指令数}} = \frac{1.5 \times 10^9 \text{ ns}}{1.2 \times 10^9 \text{ 条}} = 1.25

(2) 假设两个程序在不同处理器上运行,且执行时间相同,求:运行编译器A的处理器比运行B的快多少?

假设两个程序的执行时间相同为 TT 秒,那么:

  • 编译器A的时钟频率

fA=指令数×CPIATf_A = \frac{\text{指令数} \times \text{CPI}_A}{T}

  • 编译器B的时钟频率

fB=指令数×CPIBTf_B = \frac{\text{指令数} \times \text{CPI}_B}{T}

因此,运行编译器A的处理器比运行B的快:

fAfB=指令数A×CPIA指令数B×CPIB=1×1.11.2×1.25=1.11.5=0.733\frac{f_A}{f_B} = \frac{\text{指令数}_A \times \text{CPI}_A}{\text{指令数}_B \times \text{CPI}_B} = \frac{1 \times 1.1}{1.2 \times 1.25} = \frac{1.1}{1.5} = 0.733

即运行编译器A的处理器比运行B的处理器慢约26.7%。

(3) 新编译器的加速比

  • 新编译器的执行时间

T=指令数×CPIf=6×108×1.11×109=0.66 秒T_{\text{新}} = \frac{\text{指令数} \times \text{CPI}_{\text{新}}}{f} = \frac{6 \times 10^8 \times 1.1}{1 \times 10^9} = 0.66 \text{ 秒}

  • 相对于编译器A的加速比

加速比A=TAT=1.10.661.67\text{加速比}_A = \frac{T_A}{T_{\text{新}}} = \frac{1.1}{0.66} \approx 1.67

  • 相对于编译器B的加速比

加速比B=TBT=1.50.662.27\text{加速比}_B = \frac{T_B}{T_{\text{新}}} = \frac{1.5}{0.66} \approx 2.27


1.11.4 性能公式的方程思想

问题:
一台计算机运行SPEC基准测试程序用时750秒。

  • (1) 如果SPEC指令数增加10%,CPI增加5%,则执行时间变为原来的多少倍?
  • (2) 指令数不变,如果要在CPI降低15%的情况下,让CPU时间减少20%,时钟频率应该变为原来的多少倍?
    #card
    解答:

(1) 执行时间变为原来的多少倍?

假设原来的指令数为 II,CPI为 cc,时钟频率为 ff。原来的执行时间为:

T=I×cf=750 秒T = \frac{I \times c}{f} = 750 \text{ 秒}

  • 指令数增加10%:新的指令数为 I=1.1II' = 1.1I
  • CPI增加5%:新的CPI为 c=1.05cc' = 1.05c
    新的执行时间为:

T=I×cf=1.1I×1.05cf=1.155×I×cf=1.155×750=866.25 秒T' = \frac{I' \times c'}{f} = \frac{1.1I \times 1.05c}{f} = 1.155 \times \frac{I \times c}{f} = 1.155 \times 750 = 866.25 \text{ 秒}

因此,执行时间变为原来的:

TT=866.25750=1.155 倍\frac{T'}{T} = \frac{866.25}{750} = 1.155 \text{ 倍}

(2) 时钟频率应该变为原来的多少倍?

假设原来的CPI为 cc,新的CPI为 c=0.85cc' = 0.85c
假设原来的执行时间为 T=750T = 750 秒,新的执行时间为 T=0.8T=600T' = 0.8T = 600 秒。
原来的执行时间为:

T=I×cf=750 秒T = \frac{I \times c}{f} = 750 \text{ 秒}

新的执行时间为:

T=I×cf=600 秒T' = \frac{I \times c'}{f'} = 600 \text{ 秒}

c=0.85cc' = 0.85c 代入:

600=I×0.85cf600 = \frac{I \times 0.85c}{f'}

解得:

f=I×0.85c600f' = \frac{I \times 0.85c}{600}

原来的时钟频率为:

f=I×c750f = \frac{I \times c}{750}

因此,新的时钟频率应该是原来的:

ff=I×0.85c600I×c750=0.85×750600=1.0625\frac{f'}{f} = \frac{\frac{I \times 0.85c}{600}}{\frac{I \times c}{750}} = \frac{0.85 \times 750}{600} = 1.0625

即时钟频率应该变为原来的 1.0625 倍


1.14 Amdahl定律

问题:
一个程序有50x106条浮点指令、110x106条整数指令、80x106条L/S指令和16x106条分支指令,4种指令的CPI分别是1、1、4、2,CPU时钟频率为2GHz。

  • (1) 要让程序运行速度提高到两倍,浮点指令的CPI应该变为多少?
  • (2) L/S指令的CPI应该变为多少?
  • (3) 如果整数、浮点指令的CPI降低40%,L/S指令和分支指令的CPI减少30%,程序的执行时间改进多少?

解答:

(1) 浮点指令的CPI应该变为多少?

首先计算原始的总CPI:

总CPI=(50×1)+(110×1)+(80×4)+(16×2)50+110+80+16=50+110+320+32256=512256=2\text{总CPI} = \frac{(50 \times 1) + (110 \times 1) + (80 \times 4) + (16 \times 2)}{50 + 110 + 80 + 16} = \frac{50 + 110 + 320 + 32}{256} = \frac{512}{256} = 2

假设浮点指令的CPI变为 xx,总CPI变为1:

(50×x)+(110×1)+(80×4)+(16×2)256=1\frac{(50 \times x) + (110 \times 1) + (80 \times 4) + (16 \times 2)}{256} = 1

解得:

50x+110+320+32=25650x + 110 + 320 + 32 = 256

50x+462=25650x + 462 = 256

50x=20650x = -206

x=4.12x = -4.12

这显然是不可能的,因为CPI不能为负。因此,仅通过改变浮点指令的CPI无法将程序运行速度提高到两倍 。

(2) L/S指令的CPI应该变为多少?

假设L/S指令的CPI变为 yy,总CPI变为1:

(50×1)+(110×1)+(80×y)+(16×2)256=1\frac{(50 \times 1) + (110 \times 1) + (80 \times y) + (16 \times 2)}{256} = 1

解得:

50+110+80y+32=25650 + 110 + 80y + 32 = 256

80y+192=25680y + 192 = 256

80y=6480y = 64

y=0.8y = 0.8

因此,L/S指令的CPI应该变为 0.8

(3) 程序的执行时间改进多少?

新的CPI:

  • 整数指令CPI1×0.6=0.61 \times 0.6 = 0.6
  • 浮点指令CPI1×0.6=0.61 \times 0.6 = 0.6
  • L/S指令CPI4×0.7=2.84 \times 0.7 = 2.8
  • 分支指令CPI2×0.7=1.42 \times 0.7 = 1.4

新的总CPI:

总CPI=(50×0.6)+(110×0.6)+(80×2.8)+(16×1.4)256=30+66+224+22.4256=342.4256=1.3375\text{总CPI}_{\text{新}} = \frac{(50 \times 0.6) + (110 \times 0.6) + (80 \times 2.8) + (16 \times 1.4)}{256} = \frac{30 + 66 + 224 + 22.4}{256} = \frac{342.4}{256} = 1.3375

原来的总CPI为2,新的总CPI为1.3375。因此,执行时间改进为:

21.33751.495\frac{2}{1.3375} \approx 1.495

即执行时间减少了约 49.5%


1.8 功耗

问题:
奔腾4主频为3.6GHz,工作电压为1.25V,平均静态功耗为10W,动态功耗90W;酷睿i5主频为3.4GHz,工作电压为0.9V,平均静态功耗为30W,动态功耗40W。

  • (1) 两个处理器的平均负载电容分别是?

解答:

根据公式:

动态功耗=12×C×V2×f\text{动态功耗} = \frac{1}2\times C \times V^2 \times f

奔腾4的平均负载电容 CP4C_{\text{P4}}

CP4=2×动态功耗V2×f=2×90(1.25)2×3.6×109=2×901.5625×3.6×10915.55×109 F=32 pFC_{\text{P4}} = 2\times\frac{\text{动态功耗}}{V^2 \times f} =2\times \frac{90}{(1.25)^2 \times 3.6 \times 10^9} = 2\times\frac{90}{1.5625 \times 3.6 \times 10^9} \approx 15.55 \times 10^{-9} \text{ F} = 32 \text{ pF}

酷睿i5的平均负载电容 Ci5C_{\text{i5}}

Ci5=2×动态功耗V2×f=2×40(0.9)2×3.4×109=2×400.81×3.4×10914.43×109 F=29 pFC_{\text{i5}} = 2\times\frac{\text{动态功耗}}{V^2 \times f} =2\times \frac{40}{(0.9)^2 \times 3.4 \times 10^9} =2\times \frac{40}{0.81 \times 3.4 \times 10^9} \approx 14.43 \times 10^{-9} \text{ F} = 29\text{ pF}


川大期末真题

1. 下面哪种处理器不是采用RISC指令系统?

  • A. 华为麒麟处理器
  • B. 高通845处理器
  • C. mips处理器
  • D. Intel酷睿I7处理器
    #card
    答案:
    CISC指令集主要是x86,以AMD和Intel为主
    D. Intel酷睿I7处理器(采用CISC指令集)

2. 八位四选一多路选择器控制线位数是?

  • A. 1
  • B. 2
  • C. 3
  • D. 8

答案:
B. 2(因为 22=42^2 = 4,表示4个选择)

3. 下面关于CPI的说法,错误的是?

  • A. 多周期CPU比单周期CPU的CPI大,因此单周期CPU更快
  • B. 同一台机器中运行不同的程序CPI不一定相同
  • C. mips单周期CPU各种指令的CPI是相同的
  • D. mips多周期CPU访存指令CPI比R-type型指令CPI大
    #card
    答案:
    A. 多周期CPU比单周期CPU的CPI大,因此单周期CPU更快(CPI大不一定意味着CPU更快,还需要考虑时钟频率等因素)

4. 下列哪一项和CPU的运算速度关系不大?

  • A. CPU主频
  • B. MIPS
  • C. CPI
  • D. 主存频率
    #card
    答案:
    MIPS只考虑IC和CPI
    D. 主存频率(主存频率主要影响数据传输速度,而不是CPU的运算速度)

5. 将指令从符号码翻译成二进制码的程序?

  • A. 汇编器
  • B. 编译器
  • C. 链接器
  • D. 加载器
    #card
    答案:
    符号码就是汇编语言
    A. 汇编器

6. 同一个程序,在同一台计算机的CPU超频前和超频后运行,假设内存的访问速度不变,超频前和超频后CPI对比应该是?

注:CPU超频是指增大CPU的时钟频率

  • A. 超频前的CPI大
  • B. 超频后的CPI大
    #card
    答案:
    B
    CPU的速度远远快于内存,所以CPU有很长的时间都是在等待内存的操作。
    现在我们增大时钟频率f,但是我们所需要执行的程序操作数cycle是不会改变的。
    同时等待的时间也不会变化,但是f降低,等待的时钟周期变长了
    总的时钟周期变长了。CPI = cycles/IC会变得更大

7. 某处理器执行某一段程序,该程序包含三类指令,其中运算指令120条,访存指令60条,分支指令20条,各类指令的CPI分别为5、10和2。请计算执行这段程序的平均CPI。

#card
解答:

总CPI=(120×5)+(60×10)+(20×2)120+60+20=600+600+40200=1240200=6.2\text{总CPI} = \frac{(120 \times 5) + (60 \times 10) + (20 \times 2)}{120 + 60 + 20} = \frac{600 + 600 + 40}{200} = \frac{1240}{200} = 6.2

平均CPI为 6.2

8. 编译程序对一个应用在给定的处理器上的性能有极深的影响。假定一个程序,如果采用编译程序A,则动态指令数为1.0×109,执行时间为1.5s;如果采用编译程序B,则动态指令数为1.5×109,执行时间为2.1s。若该处理器的时钟周期为1ns,请分别求出每种编译程序下的平均CPI。

#card
解答:

编译器A的CPI:

CPIA=执行时间×时钟频率指令数=1.5×109 ns1.0×109 条=1.5\text{CPI}_A = \frac{\text{执行时间} \times \text{时钟频率}}{\text{指令数}} = \frac{1.5 \times 10^9 \text{ ns}}{1.0 \times 10^9 \text{ 条}} = 1.5

编译器B的CPI:

CPIB=执行时间×时钟频率指令数=2.1×109 ns1.5×109 条=1.4\text{CPI}_B = \frac{\text{执行时间} \times \text{时钟频率}}{\text{指令数}} = \frac{2.1 \times 10^9 \text{ ns}}{1.5 \times 10^9 \text{ 条}} = 1.4


文章作者: MIKA
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 MIKA !
  目录