组合VIA/SCI硬件中的内存管理
立即解锁
发布时间: 2025-08-21 02:39:34 阅读量: 2 订阅数: 11 

### 组合VIA/SCI硬件中的内存管理
#### 1. 动机与引言
在基于非专有硬件的集群计算市场不断增长的背景下,PCI - SCI桥(可扩展相干接口)成为了越来越受欢迎的技术选择。Dolphin公司是商用SCI链接芯片的主要制造商,也是唯一提供商用PCI - SCI桥的厂商。这些桥在分布式共享内存方面具有低延迟(微秒级)和相对较高的带宽(超过80MBytes/s)的特点。
在我们的集群中,将Dolphin的PCI - SCI桥与标准PC组件结合使用。MPI应用程序在使用SCI共享内存作为消息传输的通信介质时,能从其低延迟特性中获得显著的加速。例如,某些MPI实现对于1kByte的消息大小,带宽可达约35MByte/s。
然而,基于共享内存的MPI实现存在一个主要问题:在处理长消息时,由于复制操作,CPU利用率较高。为解决此问题,通常会使用块移动DMA引擎在后台进行数据传输。但Dolphin的PCI - SCI桥中的DMA引擎无法直接由用户进程控制,需要内核调用,这增加了最小可实现的延迟,并消耗了大量额外的CPU周期。
虚拟接口架构(VIA)规范定义了将通信硬件更靠近应用程序的机制,通过将保护机制迁移到硬件中实现。VIA可视为U - Net的演进,是首次尝试定义消息传递的通用行业标准通信架构。由于其DMA传输和用户级硬件访问带来的低延迟,VIA系统相比传统通信系统能提高集群计算机的整体系统吞吐量。但对于非常短的传输大小,基于全局分布式共享内存的编程IO在延迟和带宽方面远优于VIA。
下面是不同消息大小下,Dolphin PCI - SCI桥和GigaNet cLAN VIA硬件的MPI实现带宽曲线对比表格:
| 消息大小(字节) | Dolphin PCI - SCI桥MPI实现带宽 | GigaNet cLAN VIA硬件MPI实现带宽 |
| ---- | ---- | ---- |
| 短消息 | 较好 | 较差 |
| 长消息 | 较差 | 较好 |
#### 2. 内存管理考虑因素
内存管理主要涉及以下几个方面的问题:
1. 进程的内存区域如何提供给网络接口控制器(NIC),以及主内存如何防止错误访问?
2. DMA引擎在系统中的工作位置,以及其事务如何验证?
3. 本地进程如何访问远程节点上进程的内存?
#### 3. PCI - SCI与VIA的讨论和比较
##### 3.1 问题1:进程的内存区域如何提供给NIC,以及主内存如何防止错误访问?
- **PCI - SCI情况**:当前Dolphin开发的PCI - SCI桥采用静态内存管理方式访问主内存或PCI地址空间。为避免对敏感位置的不必要访问,PCI - SCI桥仅允许访问专用内存窗口内的地址。这导致了两个主要缺点:
- 连续的导出区域在物理地址空间中也必须是连续的,并且这些区域必须与最小可导出块大小对齐(Dolphin桥通常为512kB)。
- 导出的内存必须位于该窗口内。
为处理这些问题,需要为主内存预留用于SCI的空间,但如果后续未实际导出,会造成内存浪费。此外,这些缺点使得PCI - SCI桥在MPI应用中使用困难,尤其是在零拷贝传输操作方面,因为这违反了MPI标准的架构独立性目标。
- **VIA情况**:VIA架构为NIC提供了对主内存更好的视图,采用更灵活的查找表地址转换机制,而非物理内存空间的一对一映射。与PCI - SCI相比,具有以下优点:
- VIA硬件看到的连续区域在主机物理地址空间中不必连续。
- 通过不将敏感地址范围包含在转换表中,可防止对这些地址的访问。
- NIC可以访问每个物理内存页,即使转换表的条目数少于物理页的数量,也不一定能同时访问所有物理页。
转换表不仅用于地址转换,还用于内存保护。每个转换和保护表条目都包含一个保护标签,在每次访问主内存之前会检查该标签以验证访问权限。
下面是该部分内容的mermaid流程图:
```mermaid
graph LR
A[PCI - SCI桥] --> B[静态内存管理]
B --> C[专用内存窗口]
C --> D[连续导出区域限制]
C --> E[导出内存位置限制]
F[VIA架构] --> G[查找表地址转换]
G --> H[连续区域不要求连续]
G --> I[防止敏感地址访问]
G --> J[可访问物理内存页]
J --> K[保护标签验证]
```
结论:VIA方法在本地内存访问策略上提供了更大的灵活性,若将其应用于PCI - SCI桥设计,可消除当前设计中的问题,但缺点是硬件更复杂,地址转换需要额外的周期。
##### 3.2 问题2:DMA引擎在系统中的工作位置,以及其事务如何验证?
- **PCI - SCI情况**:DMA引擎访问本地内存的方式与前面讨论的相同,因此在处理PCI - SCI桥上的物理地址时继承了所有缺点。对于全局SCI内存的访问,使用更灵活的下游转换表,实现了对全局SCI内存的虚拟视图。但DMA引擎无法区分不同进程的区域,因此硬件无法实时检查访问权限,需要操作系统内核准备或检查要发送到NIC的DMA描述符,这需要操作系统调用。
- **VIA情况**:VIA NIC实现了从用户级执行DMA描述符的机制,同时确保使用同一VIA硬件的多个进程之间的保护。用户进程可以拥有一个或多个VIA硬件的虚拟接口,通过门铃与VIA硬件连接。用户级进程可以通过向分配的门铃写入适当的值,将新的DMA描述符插入VIA硬件的作业队列。DMA传输期间的保护通过保护标签实现,DMA引擎在访问内存页之前会检查保护标签,只有当标签匹配时,访问才合法。
结论:两种架构中DMA引擎的位置基本相同,但VIA在DMA引擎和PCI内存之间进行了基于查找表的地址转换,操作在虚拟本地地址空间上;而PCI - SCI的DMA直接操作本地物理地址。PCI - SCI的DMA引擎在硬件上不支持保护,依赖正确的DMA描述符;VIA硬件在硬件层面提供了全面的保护机制。
##### 3.3 问题3:本地进程如何访问远程节点上进程的内存?
- **PCI - SCI情况**:在SCI系统中,使远程内存可访问是关键功能。每个PCI - SCI桥提供一个特殊的PCI内存窗口,即卡所看到的虚拟SCI内存。DMA引擎可访问的SCI内存也可以通过内存引用(编程IO)访问。本地主机访问全局可用的SCI内存的过程称为将全局内存导入本地地址空间;而将本地内存提供给远程SCI节点访问的过程称为将本地内存导出到全局SCI空间。在内存引用方面,处理导入和导出内存时,保护是完全有保障的,只有当进程拥有远程进程内存页的有效映射时,才能访问该内存。
- **VIA情况**:VIA架构原则上没有提供像SCI那样直接访问远程内存的机制,但可以通过远程DMA(RDMA)机制间接实现。想要在本地内存和远程进程内存之间传输数据的进程需要指定RDMA描述符,其中包含本地VIA虚拟地址空间和远程节点本地VIA虚拟地址空间的地址。
结论:PCI - SCI架构允许进程在系统中全局共享内存,而VIA硬件无法实现这一点,因为VIA并非为实现分布式共享内存而设计。
#### 4. 采用VIA方法的新型PCI - SCI架构
在我们的设计中,希望将超低延迟的SCI共享内存的优势与类似VIA的高级内存管理和受保护的用户级DMA相结合。这种组合将使我们的SCI硬件更适合需要短和长传输大小的消息传递并行应用程序。
##### 4.1 高级内存管理
为消除前面讨论的连续和对齐的导出内存区域必须位于特殊窗口的限制,我们的PCI - SCI架构将为本地和远程内存访问实现两个地址转换表。相比之下,普通的PCI - SCI桥仅使用一个转换表来访问远程内存。这种新的、更灵活的内存管理方式,结合分布式共享内存较小的最小页面大小,将使主机系统的主内存得到更好的利用。
具体来说,我们目标导入的SCI内存量为1GB,页面粒度为16kB。通过更大的下游地址转换表,页面大小可以进一步减小,以与主机系统使用的页面大小相匹配(例如x86 CPU的4kB)。在SCI术语中要导出的内存或用于VIA操作的内存粒度必须等于主机系统的页面大小,即4kB(因为主要目标系统是x86系统),计划的最大窗口大小为128MB。
以下是不同架构内存管理相关参数对比表格:
| 架构 | 远程内存访问转换表数量 | 导入SCI内存量 | 页面粒度 | 导出内存粒度 | 最大窗口大小 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| 普通PCI - SCI桥 | 1 | - | - | - | - |
| 新型PCI - SCI架构 | 2 | 1GB | 16kB(可调整) | 4kB | 128MB |
##### 4.2 从内存相关角度看分布式共享内存的操作
下面是导出/导入内存区域时地址转换的mermaid流程图:
```mermaid
graph LR
A[导出进程] --> B[注册内存到本地PCI - SCI硬件]
B --> C[调整上游地址转换表]
C --> D[内存成为全局SCI内存一部分]
E[远程导入进程] --> F[设置下游地址转换表指向导出内存]
F --> G[映射物理PCI页到虚拟地址空间]
H[导入进程访问导入区域] --> I[主机MMU地址转换]
I --> J[PCI - SCI桥地址转换到全局SCI地址空间]
J --> K[远程节点地址转换到本地物理地址]
```
图2给出了导出/导入内存区域的整体示例,展示了导入进程访问远程节点上进程导出的内存时执行的地址转换。导出进程通过在其本地PCI - SCI硬件中注册先前分配的内存来导出部分内存,注册是按页进行的。与普通PCI - SCI系统不同,这里可以利用类似于VIA架构的本地内存虚拟视图的优势。
一旦上游地址转换表条目调整完毕,导出的内存就可以被远程机器访问,因为它已成为全局SCI内存的一部分。远程机器要访问此内存,首先必须导入它,主要步骤是在其下游地址转换表中设置条目,使其指向属于导出者的全局SCI内存区域。然后,只需将与准备好的下游转换条目对应的物理PCI页映射到导入进程的虚拟地址空间。当导入进程访问导入区域时,事务将通过PCI - SCI系统转发,地址将被转换三次:首先,主机MMU将地址从进程的虚拟地址空间转换为物理地址空间(或PCI空间);然后,PCI - SCI桥将地址转换为全局SCI地址空间;最后,远程节点将地址转换为正确的本地物理(或PCI)地址。
##### 4.3 从内存相关角度看受保护的用户级远程DMA的操作
图3展示了我们PCI - SCI桥设计中DMA引擎的工作原理。该图显示的地址空间和转换表与图2基本相同,为避免图过于复杂,省略了进程的虚拟地址空间及其到物理地址空间的相应转换。
DMA引擎被两个地址转换和保护表包围。在活动节点(即DMA引擎执行DMA描述符的节点,这里是节点1),两个转换表都参与操作。而在远程节点,与编程IO情况相比实际上没有变化,因此远程节点不会区分事务是由DMA引擎生成的还是其他方式生成的。
两个PCI - SCI桥的转换表都包含保护标签,这在VIA中用于本地内存访问,在这里也用于远程SCI内存访问。结合VIA的描述符通知和执行机制,DMA引擎无法访问错误的内存页,无论是本地(导出)还是远程(导入)的内存页。需要注意的是,仅对DMA引擎在活动节点(图3中的节点1)进行保护标签的正确性检查,在其他情况下,使用相同的转换和保护表,但忽略其中的保护标签。
综上所述,通过将VIA的先进理念融入PCI - SCI架构,新型PCI - SCI架构在内存管理、分布式共享内存操作以及远程DMA操作等方面都有了显著的改进,能够更好地满足消息传递并行应用程序的需求。
0
0
复制全文
相关推荐









