计算机的”性能“
Posted 东东7_7
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机的”性能“相关的知识,希望对你有一定的参考价值。
前言
性能这个词在很多领域都出现过,比如一个跑车的性能,一个家电的性能,一个电脑的性能,其实在我看来一个东西的性能,就是他在某一方法的能力,比如跑车最重要的就是速度,一个计算机则是他的运行速度,在计算机组成原理中理解计算机怎么运行,为什么要解决的事情的时候,很多时候就是他的性能
什么是性能
计算机的性能有两个标准来衡量,第一个是响应时间或者执行时间,要提升响应时间这个指标,可以理解为让计算机跑的更快,还有一个则是吞吐率或者带宽,吞吐率则为跑的更快
所以说计算中执行一个程度需要花费的时间越少,则他的性能就越好,而吞吐率则是在一段时间内,能做多少事情,这里的事情是指数据的数量
用搬砖来做比较的话,如果我们时间响应时间就是一趟的时间,而吞吐量则是一次能搬多少砖,同样的我们还可以多找些人来一起干,这里就出现了我们的多核CPU,这里我们可以发现,提示吞吐量我们需要去堆一些硬件就可以上去,而响应时间提升却没那么容易
计算机的计时单位:CPU时钟
时间虽然是一个很自然的用来衡量性能的指标,但是用时间来衡量的时候,却有两个问题
-
时间可能不准,就像你在掐秒表一样,就是我们在用的时间是开始的时间减去结束的时间,称为 Wall Clock Time ,就是在运行程序期间,挂在墙上的钟走掉的时间。但是我们程序在运行的时候会牵扯到程序之间的切换,内存中去取数据,所以我们要得到准确时间,则要将这些时候去除掉,在linux在有一个命令-time,可以帮我们统计出来程序实际花费的时间。
我们简单运行一下 time 命令。它会返回三个值,第一个是 real time,也就是我们说的 Wall Clock Time,也就是运行程序整个过程中流逝掉的时间;第二个是 user time,也就是 CPU 在运行你的程序,在用户态运行指令的时间;第三个是 sys time,是 CPU 在运行你的程序,在操作系统内核里运行指令的时间。而程序实际花费的 CPU 执行时间(CPU Time),就是 user time 加上 sys time。 -
其实我们拿到了准确的时间,他的运行还受运行频率的影响,降频和超频下运行速度是不一样的,不光有CPU我们还收到主板,内存的影响,所以我们将时间拆机为CPU时钟周期数和时钟周期时间,是这样的计算的
程序的 CPU 执行时间 =CPU 时钟周期数×时钟周期时间
这样CPU的运行时为:CPU时钟周期*每个时钟周期的时间
下面我们来说一下什么是时钟周期时间,他就是一个最小的时钟间隔,比如1.8GHz,就表示在1秒针可以执行的1.8G条命令,更准确的描述的话就是我们生活中时钟每走一次的最小单位,他就是秒,在他的时钟内部,有一个叫晶振的东西,我们将晶振作为CPU的时间,他每次运作就是时钟的周期时间,所以1.8GHz的时钟周期时间就为1/1.8GHz,所以当我们时钟周期越快,我们的CPU就被逼着走的更快
所以我们看上面的公式,我们要提高时钟周期时间,最好的方式只有更换一个CPU,但是对于我们来说是无能为力的,所以我们将目光放在了另一个数值上,就是时钟周期数上
我们可以将时钟周期数分解为 指令数*每条指令的平均时钟周期数
程序的 CPU 执行时间 = 指令数×CPI×Clock Cycle Time
所以我们的公式就变成了上述的公式,所以我们要优化性能,就只能从这三个入手
- 其中Clock Cycle Time我们说过了,这个取决于计算机的硬件
- CPI是平均时钟周期数,现代通过流水技术,让一条指令需要的CPU Cycle尽可能的少
- 指令数,代表执行我们的程序到底需要多少条指令、用哪些指令。这个很多时候就把挑战交给了编译器。同样的代码,编译成计算机指令时候,就有各种不同的表示方式。
我们可以将自己想象为一个CPU,你的主频就是就是你的打字速度,CPI就是你会使用各种快捷键来减少指令,指令数代表着你写的逻辑够合理,能减少很多时间,这时候从外在上来看你的性能是十分好的
跑分作弊是怎么做到的?
在我看来,跑分作弊可能就是让他在运行相应程序的时候给与更高的优先级和响应中断,同时可能在跑分的时候CPU达到超频运行以达到更高的分数
怎么样去提升计算机的性能呢?
我们上面说了计算机的性能为:指令数*CPI(平均指令周期)*时钟周期时间
所以我们要想提高性能,就只能从上面的三个参数入手,指令数和CPI都不是那么容易搞定的,所以人们看上了时钟周期时间
功耗:CPU的人体极限
于是从1978年的8086CPU开始,他的主频从5MHZ开始一直到2000年已经达到了1.4GHZ,按照这个速度,我们现在的计算机主频应该已经达到了10GHZ以上了,但是我们现在电脑的主频却只有3GHZ左右,这又是为什么呢?下图为CPU主频的变化
因为当时人们发现将主频做到2.4GHz,却比不上1.4GHz的处理器。这其实就是功耗搞的鬼,一个3.8GHz的他的功耗达到了130瓦,而现在使用ARM架构的iphone X只有4.5瓦
我们的CPU,他的结构其实为超大型集成电路,这些电路都是由一个个晶体管组成,里面的晶体管不断的”打开“和“关闭来”完成运算,而我们提升主频就是加快他的打开和关闭速度,由于晶体管之间的距离变远会影响电信号的传输速度,所以在有限的空间内我们还可以通过添加更多的晶体管来完成运算,但是我们盲目的提高主频和晶体管数量,就会导致功耗增加,在功耗增加后晶体管就会发热,发热会导致CPU出错。所以我们晶体管的频率是有限的,以下有一个公式来表示功耗
功耗 ~= 1/2 ×负载电容×电压的平方×开关频率×晶体管数量
那么我们提升性能使,要增加晶体管的数量,同样面积下要将晶体管做的尽可能的小,这个就是平时我们所说的提升“制程”。从 28nm 到 7nm,相当于晶体管本身变成了原来的 1/4 大小。
但是由于功耗增加,我们就要降低我们电路的电压,将电压降低5,就会将功耗降低1/25
事实上,从 5MHz 主频的 8086 到 5GHz 主频的 Intel i9,CPU 的电压已经从 5V 左右下降到了 1V 左右。这也是为什么我们 CPU 的主频提升了 1000 倍,但是功耗只增长了 40 倍。
阿姆达尔定律
通过上面的描述我们知道了CPU在响应时间上慢慢的会到一个极限,所以我们开始将目光转向了吞吐率,我们将CPU做到了4核,8核,虽然响应时间没有变,但是一次运输的数据量上去了,这就是通过并行来提高效率
但不是所有问题都可以通过并行去解决的,我们要满足几个条件
- 这个问题本来就可以分解为多个小问题去解决
- 能分解的问题确定能汇总在一起
- 在汇总这个阶段,是没有办法并行解决的,还需要按顺序来
这其实就引出我们用的一个定律:阿姆达尔定律
优化后的执行时间 = 受优化影响的执行时间 / 加速倍数 + 不受影响的执行时间
比如在计算向量的一小段的点积,需要 100ns,加法需要 20ns,总共需要 120ns。这里通过并行 4 个 CPU 有了 4 倍的加速度。那么最终优化后,就有了 100/4+20=45ns。即使我们增加更多的并行度来提供加速倍数,比如有 100 个 CPU,整个时间也需要 100/100+20=21ns。其中加法就是不受影响的执行时间
原则性的性能提升方式
- 加速大概率事件:就是当人们发现一个方法能大概率提升性能的时候,就去多研究它,。最典型的就是,过去几年流行的深度学习,整个计算过程中,99% 都是向量和矩阵计算,于是,工程师们通过用 GPU 替代 CPU,大幅度提升了深度学习的模型训练过程。本来一个 CPU 需要跑几小时甚至几天的程序,GPU 只需要几分钟就好了。Google 更是不满足于 GPU 的性能,进一步地推出了 TPU。(运行时编译热点代码的机制,缓存)
- 通过流水线提升性能:其实就是上面的并行的思想,将一个产品变成一个个细分的任务,同时生产,最大化效率(并发编程)
- 通过预测提升性能:猜测下一步会做什么,提起准备,典型的例子就是在一个循环访问数组的时候,凭经验,你也会猜到下一步我们会访问数组的下一项。(浏览器的访问 )
以上是关于计算机的”性能“的主要内容,如果未能解决你的问题,请参考以下文章
为什么运放差分放大电路中,输出信号电压幅值会略大于输入信号幅值*放大倍数?运放的选型参数有说法!
✔BOPA1602 双运放高性能 低噪声 极低失真度运放模块 35MHz带宽
✔BOPA1602 双运放高性能 低噪声 极低失真度运放模块 35MHz带宽