计算机最早提高性能的方法

 

计算机基础课第 2期分享

 

转载请联系授权(微信ID:qianpangzi0206)

 

01

早期计算机的提速方式

 

随着本系列进展,我们知道计算机进步巨大,从 1 秒 1 次运算,到现在有千赫甚至兆赫的CPU,这是很大的计算量。

 

早期计算机的提速方式是减少晶体管的切换时间。晶体管组成了逻辑门,ALU 以及前面的其他组件。但这种提速方法最终会碰到瓶颈,所以处理器厂商,发明各种新技术来提升性能,不但让简单指令运行更快,也让它能进行更复杂的运算。

 

上节我们写了个做除法的程序,给 CPU 执行,方法是做一连串减法,比如16除4 会变成16-4 -4 -4 -4,碰到 0 或负数才停下。但这种方法要多个时钟周期,很低效。

所以现代 CPU 直接在硬件层面设计了除法, 可以直接给 ALU 除法指令,这让 ALU 更大也更复杂一些。

复杂度 vs 速度的平衡在计算机发展史上经常出现。

举例,现代处理器有专门电路来处理图形操作, 解码压缩视频, 加密文档等等,如果用标准操作来实现,要很多个时钟周期。你可能听过某些处理器有 MMX, 3DNOW, SEE。它们有额外电路做更复杂的操作,用于游戏和加密等场景。

指令不断增加,人们一旦习惯了它的便利就很难删掉。所以为了兼容旧指令集,指令数量越来越多。英特尔 4004,第一个集成CPU,有 46 条指令,足够做一台能用的计算机,但现代处理器有上千条指令,有各种巧妙复杂的电路。

02

如何快速传递数据给 CPU

 

超高的时钟速度带来另一个问题,如何快速传递数据给 CPU。就像有强大的蒸汽机  但无法快速加煤,RAM 成了瓶颈。RAM 是 CPU 之外的独立组件,意味着数据要用线来传递,叫"总线"。总线可能只有几厘米,别忘了电信号的传输接近光速。

但 CPU 每秒可以处理上亿条指令,很小的延迟也会造成问题,RAM 还需要时间找地址,取数据,配置,输出数据。一条"从内存读数据"的指令可能要多个时钟周期,CPU 空等数据。

 

03

解决延迟的方法之一

 

解决延迟的方法之一是给 CPU 加一点 RAM - 叫"缓存",因为处理器里空间不大,所以缓存一般只有 KB 或 MB。而 RAM 都是 GB 起步,缓存提高了速度。

CPU 从 RAM 拿数据时,RAM 不用传一个,可以传一批。虽然花的时间久一点,但数据可以存在缓存,这很实用,因为数据常常是一个个按顺序处理。

举个例子,算餐厅的当日收入,先取 RAM 地址 100 的交易额,RAM 与其只给1个值,直接给一批值,把地址100到200都复制到缓存。当处理器要下一个交易额时,地址 101,缓存会说:"我已经有了,现在就给你"。不用去 RAM 取数据。

因为缓存离 CPU 近, 一个时钟周期就能给数据 - CPU 不用空等,比反复去 RAM 拿数据快得多,如果想要的数据已经在缓存,叫缓存命中,如果想要的数据不在缓存,叫缓存未命中

 

04

缓存可以当临时空间

 

缓存也可以当临时空间,存一些中间值,适合长/复杂的运算。

继续餐馆的例子,假设 CPU 算完了一天的销售额,想把结果存到地址 150,就像之前,数据不是直接存到 RAM,而是存在缓存。这样不但存起来快一些,如果还要接着算,取值也快一些。

 

05

缓存同步问题

 

但这样带来了一个有趣的问题,缓存和 RAM 不一致了。这种不一致必须记录下来,之后要同步。因此缓存里每块空间  有一个特殊标记叫 "脏位"。这可能是计算机科学家取的最贴切的名字。

同步一般发生在 当缓存满了而 CPU 又要缓存时,在清理缓存腾出空间之前,会先检查 "脏位",如果是"脏"的, 在加载新内容之前, 会把数据写回 RAM。

明天继续另一种提升性能的方法。

 

相关阅读:

   

  1. 简单的cpu指令

  2. CPU最重要的指令JUMP

  3. CPU的核心原理

     

 

全部评论

相关推荐

喵_coding:年底缺人是短视频营造出来的 而且一般说的也很宽泛 不是特指后端
点赞 评论 收藏
分享
02-12 20:22
重庆大学 Java
字节暑期刚入职四天,因为是年前,所以很多正职都放假走了,也就没有给我分配mt,然后有一个老哥在我来的时候给我发了一个landing手册,然后还有关于部门业务的白皮书,还有一些业务代码。然后本人是java面的,进来第一次接触go语言 前面几天熟悉了一下go的语法和go的框架,可以读但是还不太会写,然后业务白皮书也看的很头疼,包括landing手册里要了解的很多东西说实话我看文档真的快看死了,一个嵌套一个,问题是我还完全不知道咋用这个我了解的东西,还有就是那个项目代码,那个老哥喊我去写写单测,熟悉一下go的语法,但也进行的很困难(这是我第一段实习,之前都是springboot那一套,真不太熟悉这个)想问问大家的建议,就是我从现在开始到在开年回来之前应该做些什么,我目前就一个想法 就是复现一个landing手册上的go框架小项目 就是相当于帮自己锻炼锻炼怎么写go 或者各位大佬有没有更好的锻炼go语法的建议还有就是大家都在说vibe coding,那我应该怎么锻炼自己使用ai的能力,感觉我除了给一些需求然后它给我生成代码,好像就没别的用法了,那些什么工作流、拆解、skill啥的都不知道从哪一个地方开始,包括我现在正在实习,不知道精力该怎么分配,去网上想找找关于agent开发的一些学习流程,说实话,众说纷纭,有的是从python开始打基础然后系统学那些rag prompt langchain mcp等等,有的是说直接找一个github上的ai项目然后反复问ai,我确实有点迷茫,恳求各位大佬能留下你们宝贵的建议,我一定认真反复深刻学习有一说一 我觉得字节饭挺好吃的!
Jasonnnnnn...:直接把项目代码喂给AI然后让它帮你分析,如果组里已经有一些流程图总结的话最好,没有的话自己画一个 Go的话其实只要把基础语法搞明白就行了,项目里很多都是直接让ai帮你写好然后自己稍微改下,不用学的特别深 ai的话,可以自己写一些md文件来搞点小东西,但除非你打算转算法,否则不用把rag langchain学的特别深,了解下就行了
字节跳动公司福利 1371人发布
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务