对复杂SoC的性能探索
人们对自动化,分布式人工智能以及更加丰富的用户体验的追求(譬如自动驾驶,AR和VR)促进了嵌入式系统的改进,使它们拥有了更加强大的连接及数据处理能力。
汽车,机器人以及个人设备的系统上应用了越来越丰富的传感器以及执行器。它们使用特定的计算方法以有效实现机器学习和图像处理,也利用相似的算法处理感知到的数据。因此,片上系统(SoC)正变得更加异构化,具体表现在它集成的元件和源于这些元件的流量特征上。
早期对复杂SoC的性能模拟必须在准确性和速度中寻找平衡,这样才能在合理时间内得出有效的结果。高精确度微架构组件的使用常常导致模拟时间过长,对于性能模拟的目标不利;在早期设计阶段,详细的模型和运行这些模型的软件层也经常难以获取。
这些困难也带来了机遇。通过使用抽象化方式对这些组件的性能特点进行建模,性能模拟不仅变得更快,其合理范围内的准确性也得以保持。这提升了早期性能探索的生产力。
AMBA ATP 生态系统
利用这一机会,Arm在2019年4月推出了AMBA ATP。AMBA ATP是对硬件接口的流量特征进行建模的一种标准规范。作为可在各个系统间使用的标准,它帮助用户精准地在流量配置中描述流量特征,并将这些特征集成到系统中,注入或提供流量。自发行后,AMBA ATP已经被我们工业界和学术界的合作伙伴接纳与使用。
2020年5月,Arm推出了AMBA ATP引擎,也就是AMBA ATP的开源应用。推出这一引擎的目的是推广AMBA ATP。利用适配器可以将它集成到主平台。对使用流行的gem5模拟器进行模拟的主平台,Arm提供了一种适配器的应用。
像gem5这样的全系统模拟器支持启动及运行真实系统中未修改的软件栈,例如一个安装了一系列子应用的Linux系统。全系统模拟能更好地捕捉访问系统资源时的软件互动,比如在访问共享内存时的限制,CPU调度任务的优先度以及从CPU代码中编程的设备的所有权。
软件控制的动因
在被CPU代码编码的设备中,流量生成受到CPU将操作卸载给设备的时间的限制,而这一时间又取决于软件交互和系统状态。静态调度的流量生成并不能捕捉到这些因素的影响。除此之外,设备流量在运行中访问的地址范围也是由软件编写的。
AMBA ATP引擎,也就是AMBA ATP引擎3.0最初的发布为适配器提供了标准API。在模拟设计时,它能配置和激活流量分析。新的AMBA ATP引擎3.1则推出了一个可编程的层,令这些API对软件可见。这一功能在保证了前文提到的因素下实现了地址空间的实时配置以及流量生成。
对AMBA ATP 引擎3.1的介绍
我们高兴地宣布AMBA ATP引擎3.1的发行。该引擎有以下亮点:
对可选的Programmers model设置了标准规范。它使软件能适用于各种兼容的适配器,同时去除了对特定适配器软件栈的需求。
为gem5适配器应用了Programmers model,允许了在ATP实现下的gem5模拟中的软件使用与开发。
应用Linux核模块来驱动Programmers model。这一模块能管理gem5转换器及其他适用于这一标准的转换器。实现了对用户层面应用的开发。
通过新的Yocto层,官方发布了一个全系统环境,使ATP实现下的 gem5模拟启动变得简单快捷。
支持gem5-20.1。
以下部分总结了此次发行的亮点,设计细节及使用请参照官方文档。
一个标准的Programmers model
Programmers model定义了一系列的标准寄存器和指令,用于在Engine Requester设备上为多种流量编程。在引擎中,每个Engine Requester都由一个形式为.atp文件的master_id定义。适配器能应用每个Engine Requester可见的那个Programmers model。以下是Programmers model的一些特点:
用于从流量中的读和写流量而设置的内存空间的单独配置
与Arm MPAM PARTID相似的标签编程,用于识别系统内特定流量。
通过中断对流量完成进行异步提醒
通过标准的Device tree能找到可见的Engine Requester
ATPDevice:gem5适配器的可编程性
每一个新的ATPDevice gem5 模型都代表了一个可见的Engine Requester。ATPDevice应用了标准的Programmers model。在一次模拟中,用户能例化多个ATPDevice,并分别对它们进行编程。
图1:ATP和gem5的系统图
用软件栈来驱动流量生成
目前官方的引擎库中,有两个新Linux核模块是可用的。
设备模块令Engine Requester中可编程的层对软件可见。它在编写流量时也是主要接口。这一模块可以驱动任一适配于标准Programmers model的设备,其中包括ATPDevice。 每一个由设备模块管理的ATP设备都会显示为/dev/<name>。
缓冲管理模块为Engine Requester和 CPU 核之间分配共享的内存缓冲区。这有效实现了生产者-消费者软件模型,例如一个CPU处理器消费由ISP生产的处理后图像,或者一个DPU消费一个由GPU渲染的框架。缓冲管理模块显示为/dev/atpbuffer。
除Kernal模块之外,库中还有一个形式为C用户库的用户API。通过提供高等级的API,它使应用开发相较于Linux软件栈变得更加容易。这个用户API也与C++应用兼容。
以下是该功能的应用示例:
同时获取缓冲管理器以及需编程的设备的文件描述符,也就是DEV0。
指定一个4KiB 的共享缓冲器,将DEV0连接为这一缓冲器的用户。
为流量STR0获取一个独特的ID。在引擎中,这一ID独一无二,可以被用于更进一步的操作。
通过打开流量STR0以开始在DEV0上进行流量生成。使用一个值为1的标签来识别系统中的流量。4KiB的缓冲器是读取流量的源。由于没有写入流量,-1会被作为最后的参数。
这一示例有意省略了释放缓冲器和文件描述符的关闭指令。
最后,一个基于CppUnit的C++测试套件会被用来测试kernal模块和用户API的功能。
Meta-atp:为可编程的流量生成提供的即用型环境
Yocto是一个开源项目,它帮助用户基于一些软件层来创造一致以及即用型的环境。这些层可能来自不同的提供者。Arm也通过开源的meta-arm 库提供自己的层。
为了提高具备AMBA ATP可编程流量生成的环境的访问量,我们高兴地宣布,meta-atp 层会作为Yocto 3.0 稳定版本的meta-arm 库中的一部分发行。Meta-atp层提供了一个基于gem5和AMA ATP引擎集合的即用型环境。同时,它还有一个提供ATP核模块,用户API和核测试套件的Linux核。
用户最多只需要四个指令便能建立并访问这个环境。详情请参照官方文档。
总结
随着AMBA ATP引擎3.1的发行,用户现在能在Linux环境中编写AMBA ATP流量生成。这不仅使用户从AMBA ATP模型中受益,也保留了软件交互以及系统状态对流量生成的影响。
除此之外,在可编程的流量生成器支持下,标准Programmers model规范也使得新型适配器的开发变得更加容易。Kernal模块能与任何适配的转换器兼容。
通过提供可编程的AMBA ATP流量生成环境,Meta-atp Yocto层的发行进一步提升了对即用型环境的访问量。这可以作为更加复杂的主平台配置的参考。
用户现在能在官方库下载新的ATP 引擎3.1。需要简单建立基础开发平台的用户可以参考Yocto项目快速指南,或者使用meta-atp为特定的硬件定制化你的构建。更多细节请参照官方的meta-atp文档。
原作者:Adrian Herrera