《嵌入式软件的时间分析》读书活动:7 第七章读书笔记-多核及多ECU环境下的软件时间
[复制链接]
本章节讲解的是多核或者多ECU下软件执行的一些知识和问题。
目录如下:
第7章 多核及多ECU环境下的软件时间 154
7.1 多核基础知识 154
- 7.1.1 Amdahl vs.Gustafson——谁是对的? 155
- 7.1.2 CPU 核心——同构(Homogeneous)、异构(Heterogeneous)
还是锁步(Lock-step)? 155
- 7.1.3 锁步多核 156
- 7.1.4 英飞凌 AURIX——同类、异类和锁步 157
7.2 并发执行的多种类型 158
- 7.2.1 应用程序的并行执行 158
- 7.2.2 函数的并行执行 159
- 7.2.3 指令的并行执行 164
7.3 数据一致性,Spinlocks 165
- 7.3.1 确保数据一致性的理想解决方案 168
- 7.3.2 确保数据一致性的成本 169
7.4 存储地址克隆 170
7.5 总结 172
1. 基础知识
现在处理器通过引入缓存和复杂的流水线提供处理器时钟速度,但是处理器的性能提升不能无限制提高,当处理器以最高速度运行时,所需的电压和时钟频率成正比,所需的功率岁频率的增加而提高三倍。高频率还会带来电磁兼容性(EMC)的挑战,高频率工作就像是无线电一样,会与其他电气信号产生耦合,所以另一种提高高计算能力的方法就是多核。
分类:
- 同构多核:具有多个相同架构的核心;
- 异构多核:具有多个不同架构的核心;
- 锁步多核:从软件角度看,软件将在两个相同的核心上并行执行,这样可以检测到暂态错误(非永久存在但偶尔会发生的错误)。锁步多核仍然需要看成是单核处理器。代码将由两个核心同时执行,其结果由硬件执行比较。这里的“同时”不是完全同时,第二个核心的执行将被延迟几个时钟周期。
2. 并发执行的多种类型
应用程序的并行执行:嵌入式软件中,开发前会明确知道使用哪种硬件以及在硬件上运行什么软件。嵌入式硬件多核,可以将两种功能放到两个不同的核心中处理。(比如ABS系统和ESP系统,之前单核处理器中需要两个处理器来实现,通过CAN通信来进行数据交互,这两个功能可以使用一个多核处理器实现,通过共享内存交互数据)
函数的并行执行:如何将一个单核处理器上运行的函数,变成在多个处理器上并行执行,则逻辑会变得很复杂,除非从项目设计的最初阶段就设计为多核处理器函数。但是这是未来的一种发展趋势,因为很多抽象层级的代码都是由代码自动生成工具生成的,只需要确定处理器类型以及核心,生成的函数就可以是多核并行执行的。文中还介绍了函数并行的两种并行方式:双重并行和流水线并行以及说明了其优点(page 163)。
指令的并行执行:这是硬件层面的并行执行。流水线会并行处理多个命令,但是不良的跳转指令可能会影响效率。针对流水线友好的软件的一些建议:避免函数调用(可以使用宏或者inline函数提高流水线效率);避免不必要的中断,采用轮询。
3. 数据一致性,spinlocks
Spinlocks(自旋锁)是为了解决多个核心同时访问同一个共享资源时可能导致的数据不一致的问题。比如核心0和核心1同时访问一个变量并对这个变量做自增操作时,即(读取变量,然后将变量的值+1,然后将新值写回变量)。当当前变量的值为24时,一个核心读取了变量,另一个核心也在此时读取了变量,两个变量读出来的值都是24,此时都分别自增计算,返回给原变量,会导致最终此变量的结果为25,具体现象就是此变量只被增加了一次(实际上增加了2次,只不过数据不一致问题存在导致结果表现为只增加了一次)。
使用 spinlock 后,当一个 CPU 占用了某个资源(对所有其他 CPU都可见),在其占用期间,其他CPU都不能使用该资源。
使用spinlock可能会导致多核CPU都被暂停在资源等待处,所以被spinlock保护的部分应该尽可能少。
多核代码开发前期就应该考虑多核共享资源访问的问题,应该尽量避免这种资源,每个核心尽可能访问自己核心的资源。
4. 存储地址克隆
这种方式是现在多核处理器中地址访问的一种常用方式。通俗来说,就是每个核心有属于自己的RAM区域(比如,CPU0-0x700...,CPU1-0x600...,CPU2-0x500...),同时还提供本地访问地址0xD00...,每个核心都可以通过本地访问地址访问属于自己核心的地址,即CPU0通过0xD00...将访问0x700....,CPU1通过0xD00...将访问0x600....,CPU2通过0xD00...将访问0x500....。这就是地址克隆,0xD00...段就是克隆段。
地址克隆的好处,可以在克隆段定义一个变量,这个变量实际上会在每个核心的私有地址上都定义一个,然后不同的核心访问这个变量,都是访问的自己核心私有地址,这样就使用一个变量完成了多个变量的事情。这样的访问当时极大地增加了访问效率。
但是也存在一个缺点,就是如果某个核心不会使用这个变量,但是这块地址也会被这个变量占用,导致地址空洞。
5. 总结
本章主要讲解了多核架构的类型,多核软件的执行方式,数据一致性的解决方式以及地址克隆等知识,这些知识在多核开发中都会遇到,本章节算是做了一个总结。对使用多核处理器有很大的帮助。其中数据一致性是必须要重点关注分析的点,因为这在多核系统中是一个很常见的问题,处理不好会导致系统运行混乱,发生不可预期的错误。
|