草庐IT

自动驾驶域控芯片内部架构与性能影响

Jessie 2023-03-28 原文
近年来,汽车新四化的脚步已势不可挡,也给汽车电子带来了深刻的变革,逐渐过渡到软件定义汽车的时代,汽车的软件代码量和复杂度都在快速增长。毫无疑问稳定可靠的软件运行必须依靠足够强大的整车硬件作为支撑,而硬件的核心就是汽车芯片。智能汽车产业的发展越来越需要性能强劲的芯片来推进。自动驾驶芯片,本质上是一种包含处理器和控制器的高算力功能芯片,目前已量产商用的自动驾驶芯片基本处于高级驾驶辅助系统阶段,可实现L1-L2级辅助驾驶,通常这类自动驾驶域控制器所采用的芯片不需要太高的AI算力,更多的是应用逻辑算力进行相应的逻辑运算。为了满足当前和未来的系统架构发展和整车功能需求的爆发式增长,IT技术的渗透结合逐渐加快了多核大算力处理器的发展,本文将对有关智能驾驶芯片内部结构做较为详细的剖析,旨在为智能驾驶中央域控制器设计过程中需要考虑的问题提供支撑。

 

CPU逻辑运算核未来智能汽车电子电器架构和整车功能越来越复杂,需要计算能力更强大的硬件来支持越来越复杂的软件功能,这些软件功能需要更多并行计算能力,相同时间片内支持运行多个任务的串行计算,系统优化响应能力,协调资源调配。这一系列功能性能需求就越来越需要多核处理器的支持,多核处理器从内核架构上主要分为:同构和异构处理器两类。在对功耗要求很严格的车载域控制器中,通常采用的多核SoC是由CPU内核和其它内核集成的异构多核架构。

 

一般地,对于未来智能汽车域控单元的芯片SoC而言,要求适配下一代智能网联汽车架构设计,需要更多适用于生成多个线程的应用,或是执行流媒体数据处理的应用。并且由于在处理流媒体数据时,必须实现流水线的并行处理,处理独立数据时,必须利用多个线程执行。以上这些需求就必然发展为集成多个同类型CPU内核和其它加速器内核的架构。由于GPU内核擅长浮点运算,可以用于图形渲染处理,不仅可用作的矢量处理器,也可以采用GPU内核来弥补CPU内核的缺陷,用它来处理CPU内核所不擅长的那些工作。但GPU的缺陷也很明显,即无法单独工作,必须由CPU进行控制调用才能工作。严格意义上说,GPU是一种高性能的CPU运算单元。对于车载芯片选型而言,需要重点关注与CPU逻辑运算相关的几个指标。

1、逻辑算力CPU的逻辑算力与CPU的核心的个数,核心的频率,核心单时钟周期的能力三个因素有直接关系。对于多核异构CPU而言,其整体算力可看成是多个核算力的总和。CPU的逻辑算力将直接影响SOC芯片的感知处理能力,总体表现为对于前端感知的原始目标(图像、激光点云等)的前融合处理(这里不包含AI感知运算)。而整体来讲,前融合所消耗的逻辑算力可以占据整个逻辑算力的50%以上。因此,确保前端AI芯片有具备足够算力的CPU内核是极为重要的。因为对于后端MCU进行的规控来说,基本上都是采用的比较少的逻辑算力的芯片进行规划控制、决策执行的处理过程。这里需要指出一点,很多tier1提供的解决方案是针对逻辑或AI算力不充足的情况下是不断增加同类型的AI芯片来实现算力扩充,实则完全没有必要,这里不仅成本增加,且功耗也会随着增加的芯片而增大。因此,我们在进行域控制器设计中不仅需要考虑到前端SOC的AI算力是否足够,也需要充分考虑其逻辑算力是否满足需求,判定在当前架构下AI算力已满足性能需求,但是逻辑算力不够,可通过单独扩展相应的逻辑算力加速芯片作为补充。

2、主频也叫时钟频率,单位是MHz(或GHz),用来表示CPU的运算、处理数据的速度。基本上可以认为主频就很大程度上决定着CPU的运行速度,进一步地决定着对于逻辑运算单元的处理效率。在芯片选型中,我们需要充分考虑到对于CPU运算效率的需求,尽量选择主频较高的CPU。

3、缓存(CACHE)大小及速度缓存是用来存储一些常用或即将用到的数据或指令,其结构和大小对CPU速度的影响非常大,就当需要这些数据或指令的时候直接从缓存中读取,这样比到内存甚至硬盘中读取要快得多,能够大幅度提升CPU的处理速度。

4、工作电压CPU的工作电压直接影响着其运行时的功耗大小,CPU所分担的功耗直接影响着整个SOC的功耗大小。TPU/NPU/BPU AI运算核对于域控制器AI运算而言,实际更多的涉及计算机视觉中的神经网络、深度学习等相关的运算机制。这里我们需要指出的是AI运算核是没有统一叫法的,不同的公司开发的AI运算单元名字叫法是不一致的。大体上可以分为如下三种主流的叫法。

BPU算法训练一旦形成,就不支持在线编程,且必须由CPU进行调用和控制下才能高效运行。

下面将以其中一种AI运算核BPU进行详细的原理说明。

地平线的BPU内承载了进行神经网络运算的积累加运算(英语:Multiply Accumulate, MAC)单元。通过应用MAC 指令,可以使 的乘加运算用一个指令完成。而许多运算(例如卷积运算、点积运算、矩阵运算、数字滤波器运算、乃至多项式的求值运算)都可以分解为数个MAC 指令,因此可以提高上述运算的效率。同时,地平线的BPU采用双核的结构,同时在其控制单元里跑两套相同的程序,并对对方运算结果进行相互校验,由检查器模块对比两个BPU应用程序的执行输出,在输出结果一致的情况下,由检查器模块产生中断,将两个BPU当前状态以检查点文件的形式保存到存储器上,在输出结果不一致的情况下,由检查器模块产生中断,两个CPU处理器调取最近一次保存的检查点文件实施回卷以恢复系统进行重新计算。这一过程类似于实现了BPU内的锁步功能,这样可以很大程度上提升其运算结果的准确性,确保其SOC的功能安全性能。功能安全岛高性能自动驾驶芯片需要在多核架构上承载功能安全拆解的功能目标值,其中包括在软错误发生后,可以及时的进行错误纠正,将系统恢复到安全状态。这就要求在多核系统上实现一定的软硬件的功能安全设计目标。通常情况下,各个芯片厂家会倾向于纳入功能安全岛来作为实现芯片功能安全的机制。从原理上分析,功能安全岛可划分为硬件锁步,软件分区的方式来进行功能安全目标提升。如下将分别进行介绍。 

所谓硬件锁步,就是在芯片设计中同时搭载两套硬件内核,每个内核分别承载两套相同的软件模型,当输入源相同时,则实现了两个硬件内核的相同运算机制,同时该过程需要保持两个运算核的独立性,其运算的结果将会在每个周期都进行一次比较,当出现差异时,生成一个trap,该trap触发一个中断,将两个锁步核中运行状态以文件行驶保存在存储器上,并调用最近一次保存的文件回卷以恢复系统重新进行计算。整个过程相当于不断进行自检与互检的过程。

 

所谓软件分区,其目的是确保程序的并行运行和安全计算能力。其过程是根据软件的可并行性核相关安全架构,将上层软件模块分配给AUTOSAR中定义的操作系统应用程序执行相应的作业Task,且该过程需要确保ECU在运行时不会引起内部区域之间的相互干扰。片上网络由于SOC中的处理器采用了多MIPS 处理核心,每个核心拥有私有的指令缓存(I-Cache)和数据缓存(D-Cache)。片上网络,本质上是为了解决片上多核系统中不同的核心之间,核心与非核心(Un-Core)硬件单元之间数据传输问题的一种“片上通信”方案。

图像/视频处理单元SOC芯片上的图像处理单元主要包括几个部分功能:数字图像信号处理、图像分割(Pyramid)、图像拼接(Stitch)、图像渲染(GDC)以及视频编解码功能。ISP模块接收感光元件(Sensor)的原始信号数据,并处理图像传感器输出的图像信号,对图像质量起着非常重要的作用。ISP内部包含多个图像算法处理模块,其中主要包含如下几种:- 通过扣暗电流去掉底电流噪声;- 通过线性化解决数据非线性问题;- 解决镜头带来的亮度衰减与颜色变化;- 通过去坏点,剔除sensor中坏点数据);- 通过数字图像滤波进行图像去噪;- 通过感光半导体处理将原始环境光源数据转为RGB数据;- 自动白平衡,自动对焦,自动曝光;- 亮度映射曲线,优化局部与整体对比度;

此外,ISP的处理过程还包括如下几个部分:即旋转(角度变化),锐化(调整锐度),缩放(放大缩小),色彩空间转换(转换到不同色彩空间进处理),颜色增强(可选,调整颜色),肤色增强(可选,优化肤色表现)等。

图像分割实在神经网络处理逻辑之前进行简单的场景分割,将环境中明显可表达的语义进行分别输出。图像拼接是针对有一定overlap的图像进行全场景范围拼接,拼接的结果主要用于流媒体显示。

 

此外,图像处理单元一版还会额外搭载一些视频编解码核,一般可应用HEVC的方式进行编解码。更为强大的图像/视频处理单元会有能力进行3D图像渲染。这一部分可能会用到GPU的相关计算能力。这里需要说明一下的是,在我们设计域控制器的时候,很多情况下,我们选择的SOC芯片是不具备足够的3D渲染能力的,这时,从整个先进的显示方案需求出发,我们就需要采用额外的处理器进行渲染。这里有两种方案:其一,是采用驾驶域控制器的芯片扩充方案,即在自动驾驶域控制器AI芯片外围在增加相应的GPU芯片进行集成,两者可通过PCIe进行图像传输。其二,是采用座舱域控制器芯片扩充方案,即在智能座舱控制器芯片中集成GPU处理能力的芯片直接做渲染和显示。

总结自动驾驶芯片除了如上一些关键设计要素会影响域控制器的设计选型外,还包括了如下一些非关建要素,但是却还是比较重要的方面。其一,是接口外设。对于自动驾驶芯片来讲,足够多且有效的接口外设是必不可少的,因为对于下一代智能网联域控制器来说,其架构所带来的传感器数据量的变化是成指数级增加,因此,芯片内部预设足够的接口是非常必要的。基本上,我们需要SOC具备多路CANFD、PCIe、ethernet、GPIO、MIPI、UART、I2C、I2S等接口。具体情况需要根据架构来指定选用哪几路。其二,是附加存储控制。选择合适的存储器解决方案是满足目标系统对车载控制器芯片的功能和性能要求的关键,帮助设计人员解决其目标片上系统 (SoC) 的功耗、性能和面积要求。同时,附加存储控制主要可以扩充SOC芯片由于内部存储资源不充足所产生的存储数据溢出。通常附件存储可作为临时作为操作系统、数据驱动的资源池,大大降低了程序调用的难度,提升了运行效率。其三,是信息安全监控。主要包含数字身份认证、看门狗程序、底层安全驱动、加密引擎等几个方面。其目的是在系统运行期间实现系统的安全、认证启动或主机监测。

有关自动驾驶域控芯片内部架构与性能影响的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  4. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  5. .net - .NET 将如何影响 Python 和 Ruby 应用程序? - 2

    我很好奇.NET将如何影响Python和Ruby应用程序。用IronPython/IronRuby编写的应用程序是否会非常特定于.NET环境,以至于它们实际上将变得特定于平台?如果他们不使用任何.NET功能,那么IronPython/IronRuby相对于非.NET同类产品的优势是什么? 最佳答案 我不能说任何关于IronRuby的东西,但是大多数Python实现(如IronPython、Jython和PyPy)都试图尽可能忠实于CPython实现。不过,IronPython正在迅速成为这方面的佼佼者之一,并且在PlanetPyth

  6. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  7. Ruby 的数字方法性能 - 2

    我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0

  8. ruby - Ruby 性能中的计时器 - 2

    我正在寻找一个用ruby​​演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent

  9. ruby - 是否可以从也在该模块中的类内部调用模块函数 - 2

    在这段Ruby代码中:ModuleMClassC当我尝试运行时出现“'M:Module'的未定义方法'helper'”错误c=M::C.new("world")c.work但直接从另一个类调用M::helper("world")工作正常。类不能调用在定义它们的同一模块中定义的模块函数吗?除了将类移出模块外,还有其他解决方法吗? 最佳答案 为了调用M::helper,你需要将它定义为defself.helper;结束为了进行比较,请查看以下修改后的代码段中的helper和helper2moduleMclassC

  10. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

随机推荐