我叫阿Q,是CPU一号车间里的员工,我所在的这个CPU足足有8个核,就有8个车间,干起活来杠杠滴。

我们CPU的任务就是执行程序员编写的程序,只不过程序员编写的是高级语言代码,而我们执行的是这些代码被编译器编译之后的机器指令。

那一天,我正在忙活着···

“阿Q,工作时间你怎么在摸鱼啊!”,领导突然到访,吓得我一哆嗦。

“领导,我正在执行的这条指令,需要从内存读取数据,这您是知道的,内存那家伙可慢了,所以我只好等着,这可不是摸鱼哦···”,我小心地解释到。

领导眉头紧锁,指着一片电路问道:“这些是做什么的,怎么没在工作?”

“那是读取指令的电路”

“旁边那些呢”

“那是指令译码的电路,我手里这条指令还没执行完,现在还轮不到它们工作”

“反正也是闲着,就不能提前处理下一条指令吗?”,领导问道。

“不行啊,我们一直都是一条指令处理完成才处理下一条指令”

“这些电路单元闲着有点浪费啊,可惜了”,领导嘴里念叨着离开了我们一号车间,留下不知所措的我呆在原地。

指令流水线

没过几天,领导找我们几个车间的代表开了个会。

会上,领导问道:“各位,咱们执行指令的效率能不能提一提,竞争对手快追上我们了”

“这怎么提啊,我们干活够卖力的了”

“是啊,也没有划水偷懒”

各车间代表七嘴八舌地说到。

“还说没有划水?我最近去各车间巡视,经常发现有人摸鱼”

一听这话,大家都沉默,我也羞愧地低下了头。

领导接着说道:“我在想啊,咱们现在执行指令的过程存在不少的资源浪费,大家能不能别等一条指令执行完再执行下一条,而是提前执行下一条”

这话一出,在场各车间的代表都满脸问号。我们平时都是一条一条地执行指令,怎么还能提前执行后面的指令呢,这简直有点不可思议。

见大家一脸茫然,领导接着说道:“咱们现在执行指令的过程其实是分了好几个步骤的,不同的步骤需要用到的电路设备基本上是不一样的,在执行后面步骤的同时,前面步骤所用到的电路就可以腾出来用于处理后面的指令了”

就在我还有些似懂非懂时,二号车间小虎站起来说道:“我明白了!”

领导露出了满意的笑容,问道:“说说看,你明白什么了”

小虎转身来到一旁的画板上,画了一张图:

“大家请看,我们平时执行指令,差不多四个主要的步骤:读取指令、指令译码、指令执行、数据回写。在第一条指令进入指令译码的步骤时,负责读取指令的电路模块就闲下来了,这时可以用来读取下一条指令,提前节省了时间。等到第一条指令进入执行的步骤时,指令译码的电路就能用来处理第二条指令,而读取指令的电路就能用来读取第三条指令,以此类推!”,小虎得意的说到。

“妙啊,妙啊!”,我也忍不住称赞道:“整个过程就像一条流水线一样,一环扣一环!这效率肯定能提升不少”

“流水线?这个名字好,要不咱们就把这项技术叫做指令流水线吧!”,领导说到。

不久,咱们CPU各个车间就开始正式推行这项技术,把原来执行指令的过程流水线化。

在我们一号车间又增加了一些人手:负责指令读取的小A、负责指令译码的小胖,负责结果回写的老K,至于我嘛,就负责具体的指令执行。

流水线的级数

用上了流水线之后,我们CPU的工作性能一下有了非常明显的提升,甩开了竞争对手一大截,领导高兴坏了。

但还没高兴太久,不知道谁走漏了消息,竞争对手CPU们也知道了这项技术,也用上了指令流水线,我们的差距又一次缩小了。

领导又一次召开会议。

“现在该怎么办?大家想想办法啊”

会场一度陷入了沉默,过了一会儿,六号车间的代表小六才站起来发言:“领导,我有一个办法”

“什么办法?”

小六润了润嗓子说道:“我先问大家一个问题,在我们没有使用指令流水线技术的时候,假设执行一条指令需要4个步骤,每个步骤需要1ns,那执行完一条指令总共需要多少时间?4条指令全部执行完又需要多少时间呢?”

“一个步骤1ns,一条指令总共4个步骤就是4ns,4条指令就是16ns,这也太简单了吧”,二号车间小虎说到。

“没错,那用上流水线以后呢?”

“让我想想,用了流水线技术以后,从第4ns开始,每过1ns就会有1条指令从流水线上完成,完成上面4条指令,总共只需要7ns,比原来省了一半的时间。”

“说的没错,大家发现没有,如果我们把执行步骤拆的再细一些,每个小步骤需要的时间更短一些,这样流水线的深度就会更深一些,流水线中容纳的指令也就越多,性能就会变得更高。”,小六激动的说到。

领导也听得有些糊涂,打断问道:“等等,你慢一点,我没太明白”

小六继续说道:“比如从现在的4个步骤,拆成8个更小的步骤,每个小步骤需要的时间减半为0.5ns,这样一来,流水线跑起来后,每隔0.5ns的时间就会有一条指令完成,比4个步骤的情况更快了!“

“妙啊!妙啊!”,领导忍不住鼓掌说道:“就这么干”

我总觉得哪里不太对劲,却一时也说不上来。

回去之后,我们就进行升级改造,将现在的四级流水线,改造成八级。

你还别说,效果还真是立竿见影,将指令执行过程拆分得更细以后,流水线中容纳的指令数变得更多了,进一步减少了CPU电路资源的浪费,执行性能比以前更强了。

但没过多久,竞争对手CPU也把流水线级数增加了,而且比我们的还多,这可急坏了领导。

没有办法,我们也只好再一次提升流水线级数来应对。

就这样双方你来我往,我们玩起了流水线级数大战,最疯狂的时候,我们把流水线级数做到了三十级。

终于,我们搞出了事情。

我们把一条指令的执行过程拆分的越来越细,虽然是提高了资源的利用率,但每个小步骤之间都需要做好交接,就需要增加很多额外的电路设备。

步骤之间交接不仅有额外的时间开销,增加的电路设备也会产生额外的功耗。

流水线级数到了一定深度后,发现性能没有增加反而下降了,而且功耗越来越大,风扇都要疯狂转起来给我们降温。

看来这流水线级数也不是越多越好啊!我们又主动降低了流水线级数,在性能和功耗上选择了一个平衡点。

流水线里的冒险

不仅如此,我们在使用指令流水线的过程中,也渐渐地发现了一些其他问题。

有时候,我执行到一些指令,需要从内存读取数据到寄存器中。不巧的是,负责读取指令的小A也准备从内存中读取后面的指令,这同一时间咱俩都要访问内存,都要使用访存电路,这下尴尬了,搞得流水线只好停顿下来等待,等我用完了小A再用,白白浪费了时间。

还有的时候,我执行到一些指令,所需要的数据来自于前一条指令计算的结果,可流水线中前一条指令还没有结束,结果还拿不到,流水线只好又停顿下来等待。

这都还不算啥,更要命的是,遇到了有分支的时候,根本不知道要去把哪个分支的指令加入流水线中处理。

于是,我们把这些问题都集中反馈了上去,后来我发现不仅仅是我们车间,其他车间也遇到了这些问题。

大家把这些问题叫做流水线里的冒险,还给这三种问题分别取了三个名字:

  • 结构冒险 :流水线中出现硬件资源竞争
  • 数据冒险:流水线中后面的指令需要等待前面指令完成数据的读写
  • 控制冒险:流水线需要根据前面指令的执行结果来决定下一步去哪执行

一时之间大家都没有什么好的办法,遇到这些问题就只好让流水线停顿下来等待,等待前面的指令完成,再继续工作。

但不断追求性能提升的领导,肯定不会放任这几个问题不管,又会想出什么样的应对办法呢?

【完】


上面的故事,出自我的新书 《趣话计算机底层技术》 ,如果觉得还不错的话,欢迎大家冲一波呀~

CPU摸鱼被抓,上了一个新技术!的更多相关文章

  1. 用 WinUI 3 开发了一个摸鱼应用

    1. 开发了一个摸鱼 App 我做了一个简单的 App:摸鱼. 如上图所示,这个 App 就只有一个按钮,点击后假装开始 Windows Update,然后用户就可以光明正大地摸鱼了. 不要小看摸鱼, ...

  2. 【转】让Chrome化身成为摸鱼神器,利用Chorme运行布卡漫画以及其他安卓APK应用教程

    下周就是十一了,无论是学生党还是工作党,大家的大概都会有点心不在焉,为了让大家更好的心不在焉,更好的在十一前最后一周愉快的摸鱼,今天就写一个如何让Chrome(google浏览器)运行安卓APK应用的 ...

  3. python爬虫14 | 就这么说吧,如果你不懂python多线程和线程池,那就去河边摸鱼!

    你知道吗? 在我的心里 你是多么的重要 就像 恩 请允许我来一段 freestyle 你们准备好了妹油 你看 这个碗 它又大又圆 就像 这条面 它又长又宽 你们 在这里 看文章 觉得 很开心 就像 我 ...

  4. 模仿写了一个摸鱼APP解决原作者的问题

    前几天见到微博里有人提到摸鱼APP,发现需要在windows store下载才可以使用,文件约100多M左右的样子,自已没有登录微软Store的习惯.想想只有一个介面,没有必要这么大,于是,自已动手写 ...

  5. 寒武纪加速平台(MLU200系列) 摸鱼指南(四)--- 边缘端实例程序分析

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  6. 抓到 Netty 一个隐藏很深的内存泄露 Bug | 详解 Recycler 对象池的精妙设计与实现

    欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review Netty 代码的 ...

  7. 菜鸡学C语言之摸鱼村村长

    题目描述 摸鱼村要选村长了! 选村长的规则是村里每个人进行一次投票,票数大于人数一半的成为村长. 然鹅摸鱼村的人都比较懒,你能帮他们写一个程序来找出谁当选村长吗? (每名村民的编号都是一个int范围内 ...

  8. Thief-Book 上班摸鱼神器

    Thief-Book 上班摸鱼神器 介绍 Thief-Book 是一款真正的摸鱼神器,可以更加隐秘性大胆的看小说. 隐蔽性 自定义透明背景,随意调整大小,完美融入各种软件界面 快捷性 三个快捷键,实现 ...

  9. 转:用 Python 一键分析你的上网行为, 看是在认真工作还是摸鱼

    简介 想看看你最近一年都在干嘛?看看你平时上网是在摸鱼还是认真工作?想写年度汇报总结,但是苦于没有数据?现在,它来了. 这是一个能让你了解自己的浏览历史的Chrome浏览历史记录分析程序,当然了,他仅 ...

  10. 春节前“摸鱼”指南——SCA命令行工具助你快速构建FaaS服务

    春节将至,身在公司的你是不是已经完全丧失了工作的斗志? 但俗话说得好:"只要心中有沙,办公室也能是马尔代夫." 职场人如何才能做到最大效能地带薪"摸鱼",成为了 ...

随机推荐

  1. Android 通过scheme跳转支付宝实现支付

    原文地址: Android 通过scheme跳转支付宝实现支付 - Stars-One的杂货小窝 需求的来源是支付功能,由于支付宝不允许个人开通具有webhook的支付服务,所以是对接了一个支付系统( ...

  2. Spring Boot 整合邮件服务

    参考教程 首先参考了 Spring Boot整合邮件配置,这篇文章写的很好,按照上面的操作一步步走下去就行了. 遇到的问题 版本配置 然后因为反复配置版本很麻烦,所以参考了 如何统一引入 Spring ...

  3. Nginx常用基础模块

    Nginx常用基础模块 目录 Nginx常用基础模块 目录索引模块 配置方式 nginx的状态模块 配置方式 nginx访问控制模块 配置方式 nginx的访问限制模块 请求限制重定向 Nginx连接 ...

  4. 数据治理之关键环节元数据管理开源项目datahub探索

    @ 目录 概述 定义 核心功能 概念 元数据应用 其他开源 架构 概览 组件 元数据摄取架构 服务体系结构 本地部署 环境要求 安装 摄取样例 摄取入门 介绍 核心概念 命令行MySQL摄取示例 配置 ...

  5. 2022-02-26:k8s安装swagger,yaml如何写?

    2022-02-26:k8s安装swagger,yaml如何写? 答案2022-02-26: yaml如下: apiVersion: apps/v1 kind: Deployment metadata ...

  6. uni-app 环境搭建

    环境搭建:下载Hbuilder X开发者工具 下载Hbuilderhttps://www.dcloud.io/index.htmlhttps://www.dcloud.io/hbuilderx.htm ...

  7. Strings must be encoded before hashing

    Strings must be encoded before hashing 当我们将字符串传递给 hash 算法时,会出现 "TypeError: Strings must be enco ...

  8. Java网络编程----通过实现简易聊天工具来聊聊BIO

    IO模型即输入输出模型,我们今天主要来聊的是java网络编程中的IO模型---BIO模型.BIO即阻塞式IO,Blocking IOblocking [ˈblɒkɪŋ] v. 堵塞; 阻塞; 堵住(某 ...

  9. 自己动手写Docker学习笔记

    零.前言 本文为<自己动手写 Docker>的学习,对于各位学习 docker 的同学非常友好,非常建议买一本来学习. 书中有摘录书中的一些知识点,不过限于篇幅,没有全部摘录 (主要也是懒 ...

  10. Java方法的调用以及方法参数传递、方法的递归调用

    一.方法的调用以及方法参数传递 1.方法的定义: ​ 访问修饰符 返回值类型 方法名 ([参数列表]){ ​ 方法体 } 如果方法体中需要一些未知的数据作为执行条件,那么这些数据可以作为参数. 如果方 ...