Revere-AMU是ARM公司设计的一种高性能计算架构,主要面向需要低延迟、高吞吐量的硬件加速场景。这个架构的核心创新点在于其独特的缓存管理和事务处理机制,能够显著提升系统整体性能。
在现代计算系统中,缓存和事务管理是两大关键性能瓶颈。传统架构中,数据需要在不同层级的缓存之间来回移动,造成不必要的延迟。而Revere-AMU通过创新的缓存预取技术,允许数据直接"存放"在靠近使用者的缓存中,大幅减少了数据移动的开销。
提示:Revere-AMU特别适合需要频繁进行设备间通信的场景,如网络数据包处理、存储加速、AI推理等应用。
缓存预取(Cache Stashing)是Revere-AMU的核心优化技术之一。它允许主设备(如CPU或硬件加速器)指示特定数据范围应该预加载到系统中靠近接收端的缓存中,而不是传统的从内存中读取数据的方式。
这种机制的工作原理是:
Revere-AMU提供了精细的缓存预取控制,主要参数包括:
| 参数名称 | 作用范围 | 描述 |
|---|---|---|
| STASH_ENABLE | 会话级 | 启用/禁用整个会话的缓存预取功能 |
| STASH_DEST | 会话级 | 指定预取目标缓存的位置标识 |
| STASH_CTL | 会话/消息级 | 控制预取的具体区域和行为 |
缓存预取可以应用于三种数据:
STASH_DEST字段用于指定数据应该预取到哪个缓存节点。这个32位字段的具体含义取决于系统采用的互连协议:
在AXI系统中,STASH_DEST字段映射到AWSTASH信号族:
| 位域 | 信号 | 描述 |
|---|---|---|
| [17] | AWSTASHLPIDEN | 逻辑处理器ID是否有效 |
| [16:12] | AWSTASHLPID[4:0] | 逻辑处理器标识符 |
| [11] | AWSTASHNIDEN | 节点标识符是否有效 |
| [10:0] | AWSTASHNID[10:0] | 节点标识符 |
在CHI系统中,映射关系略有不同:
| 位域 | 字段 | 描述 |
|---|---|---|
| [17] | StashLPIDValid | 逻辑处理器ID是否有效 |
| [16:12] | StashLPID | 逻辑处理器ID |
| [11] | StashNIDValid | 节点ID是否有效 |
| [10:0] | StashNID | 节点ID |
值得注意的是,在CHI协议中,将StashLPIDValid和StashNIDValid都设置为0是有效的,这表示允许Home节点将数据预取到当前缓存数据的RN节点上。
STASH_CTL字段用于精确控制哪些数据区域需要被预取。它支持定义两个独立的预取区域,这在处理类似网络数据包(需要同时预取包头和包尾)的场景中特别有用。
STASH_CTL的结构如下:
| 偏移量 | 位域 | 名称 | 描述 |
|---|---|---|---|
| +0x00 | [31:19] | STASH_LEN1 | 第一个预取区域的字节数 |
| +0x00 | [18:6] | STASH_OFFSET1 | 第一个预取区域相对于起始地址的偏移量 |
| +0x00 | [5:3] | STASH_TYPE | 预取请求类型(实现定义) |
| +0x04 | [24:12] | STASH_LEN2 | 第二个预取区域的字节数 |
| +0x04 | [11:0] | STASH_OFFSET2 | 第二个预取区域相对于起始地址的偏移量 |
Revere-AMU的事务管理接口确保所有操作都能被全局观测(Globally Observed),这是保证系统一致性的关键。当AMI(加速器消息接口)被静默(quiesced)时,AMU不会发送响应消息,直到满足以下条件:
实现全局观测的具体机制由实现定义。例如,如果AMU是PCIe端点的一部分,可能需要执行零长度读取来确认已发布的事务已被全局观测。
Revere-AMU支持完整的功能级重置机制,包括PF(物理功能)和VF(虚拟功能)的FLR。
PF FLR可由以下事件触发:
PF重置会:
VF FLR可由以下事件触发:
VF重置会:
VF重置通知消息允许PF软件驱动程序清除可能与当前VF用户关联的任何状态。由于重置时所有AMI_SW都被禁用,因此可以防止新用户在PF清除先前状态之前发送/接收消息的竞争条件。
Revere-AMU定义了精细的AMI状态机,管理AMI的生命周期状态转换。主要状态包括:
状态转换由各种管理消息触发,如PF-AMI-xW-MAP(映射)、PF-F-ENABLE(启用)、F-AMI-xW-DISABLE(禁用)等。
Revere-AMU使用环形缓冲区(ring buffer)实现软件间的消息传递。每个socket(AMS)关联一个环形缓冲区,具有以下特点:
环形缓冲区的主要参数包括:
在背压模式下,生产者(对于RX AMS是AMU)必须检查是否有可用空槽位。如果有,则将消息写入WRITE_INDEX指示的槽位并递增该索引;如果没有,则返回重试。
伪代码示例:
code复制if ((WRITE_INDEX - READ_INDEX) == (1 << LOG2_SIZE))
return RETRY_LATER;
RING_BASE_PTR[(WRITE_INDEX & MASK) << (LOG2_MSG_LENGTH + 3)] = Message;
WRITE_INDEX++;
在覆盖模式下,当环形缓冲区满时,生产者会尝试递增READ_INDEX,然后写入消息。这需要原子性的比较交换操作来避免竞争条件。
伪代码示例:
code复制if ((WRITE_INDEX - READ_INDEX) == (1 << LOG2_SIZE))
COMPARE_AND_SWAP(&READ_INDEX, READ_INDEX, READ_INDEX + 1);
RING_BASE_PTR[(WRITE_INDEX & MASK) << (LOG2_MSG_LENGTH + 3)] = Message;
WRITE_INDEX++;
AMU维护状态位来指示RX socket上的新消息可用性和TX socket上的空间可用性。这些状态位被分组为:
摘要位的更新基于环形缓冲区的读写索引,但不需要实时反映socket状态。它们通过THRESHOLD参数控制,该参数可以表示为固定值或相对值(环形缓冲区大小的分数)。
THRESHOLD的编码方式如下表所示:
| THRESHOLD值 | 对应的阈值 |
|---|---|
| 0 | 1个槽位 |
| 1 | 1/16槽位 |
| 2 | 1/8槽位 |
| ... | ... |
| 14 | 7/8槽位 |
| 15 | 全部槽位 |
Revere-AMU支持不同类型的AMI-SW实现,主要区别在于AMS数据结构的存储位置和一致性保证:
类型A1:
类型A2:
类型B:
类型A1和A2的寄存器布局包括:
在实际部署缓存预取功能时,有几个关键考虑因素:
预取目标选择:
预取区域选择:
预取类型选择:
确保事务可靠性的最佳实践包括:
正确实现全局观测:
合理处理重置:
状态机管理:
环形缓冲区的性能对整体系统吞吐量至关重要:
大小选择:
槽位大小:
操作模式选择:
摘要阈值调优:
在网络数据包处理场景中,Revere-AMU的缓存预取可以显著提升性能:
事务管理机制确保:
在存储加速场景中:
AI推理加速器可以利用:
在虚拟化环境中,Revere-AMU提供:
缓存预取不生效:
事务无法完成:
环形缓冲区停滞:
缓存预取效果分析:
事务处理延迟分析:
环形缓冲区效率分析:
实现Revere-AMU时需要特别注意缓存一致性问题:
预取数据的一致性:
环形缓冲区的可见性:
健壮的实现需要全面的错误处理:
非法预取配置:
事务超时:
环形缓冲区错误:
高性能实现可以考虑:
预取流水线化:
事务批处理:
环形缓冲区优化:
开发Revere-AMU设备驱动程序时:
初始化流程:
资源管理:
消息处理:
用户空间接口设计建议:
集成到现有系统框架时:
网络栈集成:
存储栈集成:
加速器框架集成:
Revere-AMU架构的未来发展可能包括:
更灵活的预取控制:
增强的事务支持:
高级虚拟化功能:
智能资源管理:
新兴应用支持:
在实际项目中采用Revere-AMU架构时,建议从小的概念验证开始,逐步验证缓存预取和事务管理带来的性能提升,然后再扩展到更大规模的部署。同时要密切关注ARM官方的架构更新和最佳实践指南,以充分利用架构的最新特性。