CSAPP 2020-11-20

此文章的 撰写时间 可能有误

又到了开心的周末!

CSAPP Today:

  1. Amdahl’s law

    • Amdahl 定律: 设一个操作原来需要 Told 的时间执行, 现在我们对其a的部分(即 总部分×a 这部分进行1/k的优化(原来这部分 T 时间可以执行完, 现在加速到了 T/k ), 则
      • 没有加速的部分所需时间: (1a)×Told
      • 加速的部分所需时间: (a×Told)/k

    所以总体加速后的时间为 (1)Tnew=(1a)×Told+(a×Told)/k 所以加速比S=Told/Tnew就是

    (2)S=ToldTnew=Told(1a)×Told+(a×Told)/k=1(1a)+a/k

    常见的表示方法是用算出的加速比后加上一个”ד,我们对 60% 的部分进行优化, 这部分执行时间到了原来的 1/3 , 则 a=0.6,k=3 ,带入公式得出 S=1.67 , 则加速比就是1.67×, 读做”1.67倍”.

    • k 趋向于 时, 这部分时间可以忽略不计, 于是就有 (3)S=1(1a) 即使 60% 的系统可以加速到可以忽略时间的程度, 总体加速比也只有 2.5×, 这体现了amdahl定律的一个重要思想: > 只有提升了系统的大部分, 才能更好的提升整个系统

    待更新, 先吃个饭

  2. 并行/并发

    • 并发是指同时处理多个活动
    • 并行是指通过并发来加速系统
      1. 线程级并发
        • 最初的系统并不是完全意义上的同时操作, 而是反复切换上下文(反 复 横 跳 上一篇有说上下文, 主要是指当前进程的主存/寄存器文件), 后来多核和超线程出现才有了真正的并发
        • 多核是指把多个CPU搞到一个集成电路板上, 每个CPU叫一个核心(core) 比如我的dell-inspiron 5590是4核心, 就是四个倒霉鬼被焊在电路板上了 (逃, 据工厂主 资本家 说未来他们可以焊接几百的核心到一块板子上
        • 超线程指的是一个核心执行多个线程, 主要也是线程切换实现的, 但是比普通的CPU横跳地更科学, 所以速度也更快, 比如如果这个线程需要一些时间加载一个数据, 那我就切走了 你自己玩, 我去干别的
        • 这就很好解释了为什么我的PC叫”四核心八线程”, 表示有四个核心, 每个核心是一个可以同时执行两个线程(跳板)的超线程核心
        • 现代CPU大多数都是多核多线程核心, 一般他们的结构都是每个核心分别有一个寄存器, 两个L1高速缓存(详见上一篇)和两个L1共用的L2高速缓存, 然后总体上有一个所有核心共用的高速缓存L3, 然后接到总线和主存, 其中每个核心中的两个L1高速缓存分别是数据和指令缓存. 所以4核心8线程的CPU一般来讲有 4×3+1=13个高速缓存和4×1=4个寄存器
      2. 指令级并发
        • 指同时执行多个指令, 这是个比较nb的概念, 之前可能一个指令执行很多个(3~10)时钟周期, 现在通过一个叫”流水线”的东西实现指令级并发, 可以一个时钟周期内执行上百个指令
        • 像上面那样, 一个时钟周期可以处理不止一个指令叫超标量, 大多数PC的CPU都支持这个 不会吧不会吧不会都0202年了还有人的电脑不支持超标量吧
      3. 单指令多数据
        • 比如处理单精度浮点数(float)加法是一个指令, 这叫单指令
        • 同时处理8对float加法, 这叫多数据
        • 这是同时执行的, 也叫SIMD, 不知道具体叫什么, 我猜Single Instruction Multi Data
        • 有时候cpu会对一些程序自动处理SIMD, 但更好的办法是编译器来解决这些, 比如GCC就支持向量变量

为什么我用中文输入法打出来cpu第一个是川普