智能驾驶已经逐渐成为汽车的标配。
智驾芯片当然是智能驾驶的算力基石,而这玩意也常常被车企拿来宣传。如今,已经有车企开始宣传研发了1000Tops的智驾芯片。智驾芯片就如同汽车的大脑,非常的重要。那么,开发一款智驾芯片也是非常具有极高的技术含量的。今天,本文手把手教大家从零设计一款算力1000Tops的智驾芯片。
一,炼气期(L1)——算力的概念
那我们就先搞清楚这个智驾芯片算力1000Tops意味着什么
熟悉计算机的同学说这还不简单,
OPS的意思就是Operations Per Second。
每秒钟操作多少次。
计算机每秒钟算一次为1ops。
那么1T ops需要计算机算多少次?
1Tops
=1000Gops
=1000,000Mops
=1000,000,000Kops
=1000,000,000,000ops
计算完毕,每秒钟操作10的十二次方次,也就是1Tops。
我们假设有一个单发射1Ghz的CPU,
如果要达到1Tops的话,基本上需要1000个这样的CPU。
如果要是达到100Tops的处理性能,则需要100000个,
也就是10万个这样的CPU才行。
如果是达到1000Tops,则需要1,000,000,也就是100万个1Ghz的处理器。
这意味着什么?
意味着,我们可以买100万个处理器,将这么多CPU堆起来,实现1000Tops。
这么多处理器,至少需要一个火车车厢才能装下。
也就是,通过CPU堆叠的方式实现1000Tops的算力,至少需要一个车厢。
看来,在普通汽车上,通过堆CPU的方式来实现这么大的算力不太可能。
那么就需要另外想办法了。
二,筑基期(L2)——矩阵乘法
办法从哪里开始考虑。
我们从最本质的地方来考虑?
智驾芯片解决什么问题?
智驾芯片的本身是运行人工智能的算法。
人工智能算法最核心的操作就是矩阵乘法。
那么矩阵乘法的计算,就是智驾芯片要解决的核心问题。
我们用一点时间把矩阵乘法梳理一下。
例如,我们有两个原始矩阵。
矩阵A,m行,n列。
矩阵B,n行,P列
然后,我们计算矩阵C=A*B;
C是矩阵A和矩阵B的乘法结果:m行,p列
也可以写作:
我们举一个例子
两个2X2的矩阵相乘,可以如下所示。
对于一个N*N的矩阵,那么总共需要N*(N*N)次乘法和N*(N*(N-1))次加法。
所以,对于一个2*2的矩阵,里面一共用到了8次乘法,4次加法,才能得到答案。
三,金丹期(L3)——乘累加器
根据上面的分析,我们可以看到,矩阵相乘,需要的最小的算子单元就是乘法和加法。
所以你可以设计一种电路。
先做两个值的乘法,例如a11与b11。
在上面的例子中,就是1X5=5;
然后开始算,a12*b21
在上面的例子中,就是2X7=14;
然后与上一次的乘法结果(5)加起来。
2X7 + 5 = 19
每次都可以把上一次的结果与当次乘法的结果加起来,这样就可以实现矩阵一行与一列的先相乘后求和的过程。
恭喜你,你就得到了一个乘累加器。
每个MAC就是一个乘累加器(Multiply Accumulate)。
但是,现在问题又来了。
一个乘累加器,只能计算一个点的。
如果要并行,一个NXN的矩阵,那么就需要NXN个乘累加器。
这样可以并行来计算。
那如果计算这个2X2的矩阵,
我们可以用2X2,一共4个乘累加单元。
这样可以并行来计算。
下图就是这个乘累加矩阵,一共4个,可以同时进行计算。
通过上图,眼尖的你,一定发现了规律。
矩阵A和矩阵B相乘。
如同矩阵A从左往后移动,先向左移动1,3,再移动2,4
而矩阵B从上往下移动,先往下移动5,6,再移动7,8
然后进行相乘。
那么根据这个规律,就可以采用另一种叫做脉动阵列的方式来计算。
这个脉动和某饮品没有啥关系。
完全体现了数据的移动规律,如箭头方向所示。
第一步,按照规律,往右移动移动1和以及往下移动5;
第二步,以此类推
第三步,
第四步,
第五步,
这样我们就得到了最终的矩阵相乘的值。
通过累加器的脉动阵列,可以减少芯片内部的连接,因为每个累加器的输入只来自左边和右边。
这样就可以放置很多的累加器,累加器比较容易做的很大。
于是,把累加器从2X2扩展一下,可以做的很大,如下图所示:
到此,你就设计了一个矩阵乘法处理单元;
上面和左面的缓存中分为存储了原始的数据矩阵A和B。
在人工智能算法中,一个一般代表了权重矩阵(weight fifo),另一个代表激活矩阵。
这样你就设计了一个面向人工智能应用的处理器(NPU)最核心的单元。
矩阵乘法以及存储矩阵输入和输出的缓存。
四,元婴期(L4)——NPU
那么这个矩阵的行和列分别设置为多少合适?
由于神经网络的每一层的计算都比较多。
那么可以把行和列都设置成8,16,32,64,96或者更大。
那我们就先把行和列设置成96。
那我们就得到了一个96X96=9216乘累加单元。
为了存储要计算的矩阵数据,给这些数据设计了一个缓存(例如32Mbyte)。
对于矩阵乘法后的数据,还需要进行池化,激活函数,归一化等操作。
在矩阵完成运算后。
数据会被转移到激活硬件、池化硬件,并最终进入写入缓冲区以汇总结果。
还要支持多种激活函数,包括修正线性单元(ReLU)、Sigmoid线性单元(SiLU)和TanH。
于是在矩阵的输出结果后面又加上了SIMD单元可编程的处理以及池化,deconv等模块。
这样,恭喜你,你现在就设计完毕了一个NPU。
如下图所示:
设计完毕后,马老板就提出了一个问题,这个NPU的性能是多少?
有了前面的基础,这个问题就简单了。
芯片的核心算力是这个96X96的矩阵计算单元(黄色部分)得来的。
总计9,216个MAC(乘累加)。
一次乘加算两次操作。
乘+加,所以是两次
所以,这个矩阵每次hz就是18,432次操作。
做成芯片,这个NPU运行频率是2Ghz。
也就是2GX18432 = 36864Gops=36.864Tops。
是不是很简单又清楚。
五,大乘期(L5)——智能驾驶芯片
这个时候,马老板突然说了。
才37Tops性能,这性能也太差了。
你刚要解释一下,功耗,面积,编程友好,利用率这些原因。
马老板才不管那套。
性能至少翻倍,不能讨价还价。
于是,你立马想到了。
可以放两个NPU,不就可以性能翻倍了吗?
于是,你在一个SOC内部,放上了两个NPU(黄色部分),
这样,这个芯片的性能一下子就能从76.86Tops到73.72Tops。
四舍五入,就是74Tops
当然,除了提供核心算力的NPU之外。
还有系统控制作用的CPU,3个四核Cortex-A72集群,总共12个CPU,运行频率为2.2GHz;
还有图像处理作用的GPU,一个Mali G71 MP12 GPU,运行频率为1GHz
至此,恭喜你,你设计了特斯拉的智驾芯片,FSD芯片。
然后,这个芯片采用了三星的14nm工艺,整个芯片260 mm² die size(20 mm x 13 mm die size)
这是最后的芯片版图。
可以看到,整个提供算力的NPU,几乎占了芯片面积的50%左右。
这玩意占面积也占成本。
结果,芯片设计出来,马老板立马说,74Tops,这个性能指标还是太低。
出去不好吹牛。
至少要大于100Tops。
有了前面的经验,聪明的你立马想到了。
直接在板子上放两颗不就行了。
那么最后方案上,我们可以看到。
系统采用了两颗FSD芯片,智驾系统的总的算力,也达到了148TOPS。
这样,算力立马达到了高阶智驾的门槛。
即使是这样,也没有达到1000Tops的算力。
如果要达到1000Tops的算力。
根据上面的计算,增加算力,可以加多个NPU,也可以增加乘累加矩阵(MAC array)的面积。
更大的矩阵乘法单元带来了更大的算力。
看来,只要是简单的堆乘累加矩阵就可以了?
这个看起来很简单。
例如,128*128个MAC的NPU,
单个NPU如果2Ghz处理能力,
其算力就能>64Tops。
一个芯片四个NPU,单芯片就能达到256T处理能力。
板载4个芯片就能达到1024Tops的处理能力。
所以,有了前面的基础,看起来不费劲。
不要笑,可能有人问?
算力怎么能这么粗暴的叠加。
要知道,某家车企就是用了四颗智驾芯片(orin-X),宣称达到了1024Tops。
我很怀疑,他们是不是把算力都用上了,是不是扣到两颗芯片发现智驾也能工作。
其实,即使大家没有智驾软件的基础。
也能明白:
智驾软件用到的算力不等于实际硬件提供的能力。
通过小学数学也能知道,无限扩大这个乘累加器矩阵,最终的利用率就会不断降低。
例如,我们算一个96X96的矩阵,而用128X128的硬件单元算,或者256X256的矩阵单元算。
就有一大部分都空闲。
这个就是硬件利用率的问题。
所以,有句老话说的好,
算力不是万能的。
但是光有算力也是万万不能的。
看的见是智驾芯片的算力,
看不见的是智驾芯片上跑的软件和算法。
这些软件和算法的能力,其实更是制约各家智驾水平的差异的地方。
所以说:
芯片的算力,
算法的智力,
系统的合力,
唯有三者形成合力,才能驱动智能驾驶突破现有边界。
穿梭三界(全地形全天候)亦如履平地,至此方证“无人驾驶”天道。
后记:
本来,除了FSD还要写另外两款典型的智驾芯片英伟达的orin-x和华为的昇腾610,但是篇幅太长了,等下次再补上。
我是歪睿老哥,一个喜欢写作的架构师,如果你觉得本文还不错,欢迎写出你的观点,点赞,在看,分享。