当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 如何掌握多核编程和调试方法

如何掌握多核编程和调试方法 时间:2021-01-27      来源:原创
我们将讨论多核处理的各个方面,包括研究不同类型的多核处理器以及这些设备为何在当今变得普遍和流行。然后,我们将研究在芯片上拥有多个内核所带来的一些挑战,以及现代的多核感知调试器如何帮助使这些复杂任务变得更易于管理。
 
系统性能
 
从巧妙的编译器算法到高效的硬件解决方案,有许多种方法可以提高嵌入式计算系统的性能。编译器优化对于从易于阅读和理解的高级语言代码中获得最有效的指令调度非常重要。除此之外,系统还可以利用项目中可用的并行性来一次处理多个事务。当然,调整时钟频率可能是从计算系统获得更高性能的有效方法。
 
不幸的是,可以假设时钟速度在几何上有所提高的日子已经过去了。代码优化只能为您带来如此多的改进,尤其是在经过几代编译器技术开发之后。这使我们将并行性视为随着时间的流逝继续扩展系统性能的最佳机会。
 
平行性
 
挖井是一项艰巨的任务。其他人可以帮忙,将泥土铲掉,但实际挖洞通常是一个人的工作。结果,增加更多的人不会使工作更快地完成。实际上,其他人可能会妨碍并减慢该过程。有些任务不适合并行化。
 
其他任务很容易并行化。挖沟是适合并行化的任务。许多人可以彼此并肩工作。
 
该图显示了一种称为MIMD(多指令多数据)的并行形式。每个挖掘机都是一个单独的单元,可以执行不同的任务。在这种情况下,你可以想像四个挖掘机可以把工作做在约1/4个单挖掘机的时间。
 
使用SIMD(单指令多数据),单个挖掘器可能会使用像这样的一把铲子。
 
 
SIMD单元一次只能执行一种类型的计算,但是它可以并行处理几条数据。这些类型的指令在许多处理器的矢量处理单元中很常见。如果您的数据非常规则并且您需要一遍又一遍地对大型数据集执行相同的操作(例如在图像处理中),这将非常有用。但是,对于更通用的计算任务,该模型缺乏灵活性,并且不会带来性能提升。
 
这导致我们选择在单个芯片上放置多个完整的CPU子系统,从而创建多核处理器。一块芯片上的多个内核可以扩展性能。每个内核都是完整的CPU,可以独立工作或与其他内核协同工作。
 
不同类型的多核处理
 
处理器芯片上可能具有不同类型的内核组合,以及工作如何在内核中分配。
 
同类多核处理器具有同一处理器核的两个或更多副本。每个核心自主运行,并且可以通过多种机制(例如共享内存或邮箱系统)与其他核心进行通信和同步。每个处理器都有自己的寄存器和功能单元,并且可能有自己的本地内存或缓存。但是,使这种同质化的原因是,我们正在研究的所有内核都属于同一类型。
 
另一种类型的多核芯片被称为具有两种或更多种不同类型的CPU核的异构多核。在这里,核心可能具有非常不同的特性,这使其非常适合系统处理需求的不同部分。一个示例可能是蓝牙通信芯片,其中一个内核专用于管理蓝牙协议栈,而另一个内核则可以管理外部通信,应用程序处理,人机界面等。这种多核芯片可用于需要以下两种功能的应用程序:一个核心具有实时专用性能,而另一个核心具有系统管理功能。
 
现在我们来看看如何使用内核。当您拥有多个内核且这些内核运行相同的项目代码库时,就会发生对称多处理(SMP)。不同的内核可能同时运行代码的不同部分,但是代码是作为单个项目构建的,并由某些控制程序(如实时操作系统(RTOS))分派给单独的内核。必要时,以这种方式工作的内核必须属于同一类型,因为它们都使用针对一种类型的处理器编译的相同项目代码。
 
当您拥有多个内核或处理器,并且每个处理器都在运行其自己的项目应用程序时,就会发生非对称多处理(AMP)。各个内核可能会不时地进行同步或通信,但是它们每个都有自己的代码库,它们可以执行。由于它们各自运行自己的项目,因此这些核心可以属于不同类型,也可以是异构核心。但是,这不是必需的。如果两个或更多相同类型的内核运行不同的项目代码,则它们是运行AMP的同类内核。
 
请注意,对于SMP操作,您必须具有多个同类内核,因为它们都从相同的单个项目代码库运行代码。但是,如果您有多个具有不同代码库的项目来运行不同的内核,则这些项目可能是不同的内核,例如在异构系统中。但是,如果核心相同,那么效果也很好。
 
使用多核的原因
 
在过去的几年中,摩尔定律(最初于1960年代中期提出)似乎逐渐枯竭,或者至少放慢了速度。处理器时钟频率不再每2-3年增加一倍,实际上,多年来,最高速度的CPU一直在低个位数GHz范围内达到上限。
 
继续提高性能极限的一种方法是,如果可以有效地使用它们,则可以使更多的CPU内核协同工作。
 
在速度趋于平稳的同时,晶体管的尺寸也在不断缩小。尽管比过去慢,但小晶体管可以在单个芯片上封装更多逻辑。结果,使用这些晶体管在单个芯片上放置多个CPU内核可以利用多个CPU和内存子系统之间更快,更广泛的总线互连。
 
如果应用程序具有两个或多个具有不同特性和要求的工作负载,则异构非对称多处理非常有用。一种可能是实时和中断延迟相关的,而另一种可能更依赖于吞吐量而不是响应时间。该模型非常有效:例如,设备可能专用于一个核心来管理诸如Bluetooth或Zigbee之类的通信协议栈,而另一个核心则充当运行人机交互和整体系统管理操作的应用处理器。隔离的通信处理器可以提供协议栈所需的出色实时响应。此外,通过将功能修改与系统的这一部分分开,可以对通信软件进行标准认证,从而使整个产品易于认证。
 
使用多核的挑战
 
当您在芯片上放置多个CPU内核时,会带来哪些挑战?好吧,让我们深入研究它。
 
单片应用程序或软件可能无法有效使用可用的计算资源。您需要将应用程序组织成可以同时运行以使用多个核心资源的并行任务。对于软件工程师来说,这可能需要一种陌生的方式来考虑嵌入式设计。迁移现有的单循环代码可能并不容易。线程太少或什至太多都会成为性能障碍。
 
在多个线程或进程之间共享数据结构或I / O设备的应用程序可能会遇到串行瓶颈。为了维护数据完整性,可能必须使用锁定技术来序列化对这些共享资源的访问,例如,读锁定,读写锁定,写锁定,自旋锁,互斥锁等。设计效率低下的锁可能会由于多个线程或试图获取锁以使用共享资源的进程之间较高的锁争用而造成瓶颈。这可能会降低应用程序或软件的性能。如果某些内核使其他内核停滞不前,等待通用锁,导致两个内核的性能比一个内核差,则应用程序的性能甚至可能随内核或处理器数量的增加而下降。
 
不均匀分布的工作负载可能无法充分利用计算资源。您可能必须将大型任务分解为可以并行运行的较小任务。您可能必须将串行算法更改为并行算法,以提高性能和可伸缩性。但是,如果某些任务运行得非常快,而另一些任务花费大量时间,则快速任务可能要花费大量时间来等待较长的任务完成。这会导致宝贵的计算资源闲置并降低性能扩展。
 
实时操作系统可能会帮助您,但可能无法解决所有问题。在SMP系统中,实际上必须在多个相似的内核上调度任务。可以按数据或功能划分要完成的工作。如果按数据块划分事物,则每个线程可能会执行处理管道中的所有步骤。另外,您可能让一个线程在函数中执行一个步骤,而另一个则执行下一步,依此类推。一种技术相对于另一种技术的优势将取决于要完成的工作的特性。
 
在多核环境中进行调试
 
调试多核系统时有用的第一件事是所有核的可见性。理想情况下,我们应该能够同时或单独启动和停止内核,也就是说,一步运行一个内核,而其他内核正在运行或停止。多核断点对于控制一个基于另一核状态的核的运行非常有用。
 
多核跟踪可能很难实现。管理来自多个内核的跟踪信息的高带宽,以及处理来自不同类型内核的潜在不同类型的跟踪数据是一个真正的挑战。
 
(来源:IAR Systems,图由Arm Ltd.提供)
 
这是具有异构和同类多核实现的处理器示例。有两个同类的核心组,一个基于双Arm Cortex-A57,另一个基于四核Cortex-A53。这些组在它们内部是同质的,但在两组之间是异质的。
 
CoreSight调试体系结构提供了用于与所有内核上的调试资源进行通信的协议和机制,调试器可以管理所有这些信息并解析来自不同内核的消息。交叉触发接口和矩阵(CTI,CTM)允许同时暂停两个内核,触发跟踪等。跟踪基础结构包括用于平滑跟踪流的串行(SWD)和并行(TPIU)跟踪端口,以及将每个源的跟踪合并为单个流的跟踪漏斗。与双核部件相比,所示的示意图表示要控制的芯片要复杂得多。
 
IAR Embedded Workbench中的C-SPY调试器为对称和非对称多核调试提供支持。通过多核选项卡上的调试器选项可以启用此功能。要启用对称多核调试,所需要做的就是输入内核数,以使调试器知道要与多少个不同的处理器进行通信。其他IDE可能具有类似的可用选项。
 
在右侧(上),您可以在调试器中看到一个视图,其中4核Cortex-A9 SMP集群显示了其核的状态,而其他3个核正在执行时,核号2停止了。
 
非对称多核系统可能会使用异构多核部件,例如ST STM32H745 / 755,它具有一个Cortex-M7内核和一个单独的Cortex-M4。在这种情况下,调试器在运行时将使用IDE的两个实例(主节点和节点)。每个内核一个,因为两个内核运行不同的项目代码。
 
在IDE的每个实例中,都有关于受控制的内核以及在另一个窗口中受控制的另一个内核的状态信息。可以选择一些选项来控制调试器的行为,以便在开发人员的控制下一起或单独启动和停止内核。
 
由于交叉触发接口(CTI)和交叉触发矩阵(CTM)共同构成了Arm嵌入式交叉触发功能,因此可以实现完全控制。有3个CTI组件,一个在系统级别,一个专用于Cortex-M7,一个专用于Cortex-M4。如下图所示,三个CTI通过CTM相互连接。调试器可通过系统访问端口和关联的APB-D访问系统级和Cortex-M4 CTI。Cortex-M7 CTI物理集成在Cortex-M7内核中,可通过Cortex-M7访问端口进行访问。
 
(来源:IAR Systems,图来自STMicroelectronics,来自M0399参考手册)
 
CTI允许来自各种来源的事件触发调试和跟踪活动。例如,在一个处理器内核中达到的断点可以停止另一个处理器,或者可以将在外部触发输入上检测到的转换设置为开始代码跟踪。
 
在此示例中,异构多核处理器在单个芯片上具有Cortex-M7内核和Cortex-M4内核,使用了两个单独的程序:一个运行在Cortex-M4上,另一个运行在Cortex-M7上。每个项目都使用FreeRTOS来管理处理器上运行的软件。两个内核通过共享内存接口进行通信。但是,应用程序都使用FreeRTOS消息传递机制与其他处理器进行通信,并且隐藏了底层机制的复杂性。因此,从一个CPU的角度来看,它只是发送或接收带有另一任务的消息。另一个任务恰巧在另一个CPU内核上运行,这是透明的。
 
下图是IDE中的Workspace资源管理器寡妇。这里显示了两个项目的概述,因此您可以看到Cortex-M7和Cortex-M4项目的内容。
 
 
 
通过选择窗口底部的其他选项卡之一,您可以将焦点切换到M4项目或M7项目。
 
Cortex-M7项目有一个任务,该任务将消息发送到在Cortex-M4上运行的任务。Cortex-M4具有正在运行的接收任务的两个实例。Cortex-M7有一个“检查”任务,该任务会定期运行以查看一切是否仍在正常运行。
 
最后,调试器加载两个项目。这意味着将为第二个调试器启动Embedded Workbench的其他实例。
 
要为不对称多处理支持设置调试器,我们需要将一个项目指定为“ Master”,将另一个项目指定为“ Node”项目。实际上,选择是任意的,并且仅确定哪个项目具有启动时启动另一个项目的能力。
 
“节点”项目没有特殊设置,并且不知道它正在作为另一个项目的“节点”运行。
 
这样,当“主”项目启动其调试器时,它将自动启动IDE的另一个实例,以适应将在其中运行第二个项目的第二个调试器会话。

上一篇:嵌入式AI的应用

下一篇:嵌入式设计正在被关键行业塑造的更加完善

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部