到底什么才算是算力强大呢?所以为了通俗易懂,这里我们用做菜来举一个例子。

假设做菜分成洗菜、切菜、炒菜,每个工序都有一个人负责。现在假如我们加上一道工序,炒完菜以后还要摆盘雕花,那么,假设每道工序时间都一样,因为后面多了一道工序,是不是意味着后面的算法比前面的慢33%?
如果只做一盘菜确实是这样的,但是假设我们要做100盘甚至1000盘菜呢? 你会发现做的盘数越多,出菜的平均速度无论前者还是后者会无限趋近相等,这就是流水线操作。
CPU内部存在着无数多的流水线,一般来说,同等工艺和设计,电路规模和路径长度加法会小于乘法而乘法会小于除法,类似的还有整数运算和浮点运算,甚至进一步的开平方运算和指数运算,但如果有了流水线,只要指令重复次数够多,流水线分段越详细,复杂的运算和简单的运算在平均时间上都会无限趋近于相等,所以算法指令条数上的复杂度并不是评判性能差距的唯一标准,怎么做,做多少次也同样重要。
那么是否可以说计算机的工作频率越高,可以理解成做菜每道工序的耗时越短,那么性能就越高呢,或者说假设我们可以雇佣很多人,我们继续把比如洗菜这个工序进一步细分,这样每道工序的时间就会更短,那么性能就越高呢?
注意一个前提,我们只是缩短了工序时间提高了频率,但如果只做一道菜,其实该要多久还是要多久,所以即使高频也不一定高能,我们只是缩小了时间粒度控制,在总体工序不变的情况下,细分工序并不能缩短路径。当然如果我们继续做几千道几万道菜,确实,那是变快了。
但这就来了另外一个问题,做菜是要有原材料的,送菜的速度跟不上,出菜的速度也还是不能提高,就像CPU运算可以做很长的流水线做很高的频率堆很多的核心做多线程,但数据需要从内存调过来,内存通讯速度跟不上,不论CPU算力如何强大,性能瓶颈也还是会卡在了内存速度上。
所以如何提高通信速度呢,两点,一个是提高通讯位宽,相当于把路修宽一点,另一个是提高通信频率,也就是让路上跑的车开快一点。 找云服务器,8⃣️月份有羊毛可以薅yijiacloud.com.cn
那么问题又来了,现在我们解决了内存通讯带宽的问题,是不是算力又上去了。
还真不一定,我们继续拿做菜比喻,这道菜需要某一个材料,但这材料得先加工过,所以当你去工厂里要材料时,工厂会说你稍等,我这就给你开始生产,你看光路好走了还不行,性能又卡在了准备上。
它对应的正是内存控制器的数据准备时间,DRAM读取有一个激活的过程,一般这个时间在十几个纳秒左右,可以说我们从ddr发展到ddr5成为主流,这个激活时间仍然没能够缩短。
那又怎么办呢,所以ddr控制器会有一个预激活过程,意思是当你读取当前行单元时,下一行会预激活完成数据准备工作,这也是为什么连续访问会比随机访问快得多。
当然以上只是性能优化中三个简短的例子,实际上还有分支预测,缓存调度策略,并行指令等诸多问题,不一一阐述了。
性能优化是一个很复杂的系统工程,不能靠单一维度单一场景进行评估,性能优化是多条件依赖贯穿算法软硬件架构的。
单一从语言,算法,某一性能指标,某个特定需求进行评估都是片面不准确的。
以上。

被折叠的 条评论
为什么被折叠?



