Myrinet系统软件GM分析
2009-04-27
作者:麦联叨 戴梅萼
摘 要: GM是Myrinet专用的系统软件,由于采用了用户层通信、在LANai上运行MCP等机制,故具有占用系统开销小、延迟短、带宽大等优点,在国外已广泛应用于并行计算领域。
关键词: Myrinet GM 用户层通信 LANai
1 GM简述
GM是美国MyriCom公司为其高性能网络产品Myrinet而推出的系统软件,专门用于网络并行计算,在国外已广泛应用于大规模并行计算领域。
GM的设计思想就是要实现一种高带宽低延迟,主机开销极少的通信方式。GM的高效率,除了采用用户层通信机制等以外,关键在于充分配合Myrinet在硬件架构上的特性。GM在Myrinet网卡的LANai芯片上运行MCP,承担了大部分的通信处理工作,大大减轻了主机的通信开销。总的来说,GM具有如下特性:
·支持超过1000个节点;
·可在不可靠网络环境中提供可靠、有序的数据传输服务;
·低开销,每个数据包只耗费主机大约1μs的处理时间;
·通过提供高低两个优先级,可实现高效的防死锁算法;
· 对多个用户层程序直接访问网络接口提供存储保护;
· 理论上支持的消息长度可达231-1字节,实际则受限于主机DMA内存大小;
· 自动对Myrinet进行映射,解决路由问题。
GM的不足之处在于编程模式不灵活和不支持多线程。
2 GM的结构
GM由MCP,DRIVER,LIBGM三部分构成。这三部分之间的关系可以用图1来描述。
LIBGM为用户程序提供编程接口,其中最重要的是发送和接收函数。此外,还提供一整套通用函数,如初始化、DMA内存管理、令牌管理、哈希管理、CRC校验等。
LIBGM 所实现的功能可分成三类:第一类是通用函数,如哈希管理;第二类是通过DRIVER实现的功能,如内存映射功能;第三类是和MCP协同完成的功能,如发送和接收操作。其中第三类是完成数据通信功能的核心。为提高整个系统的性能,LIBGM和MCP之间的交互都绕开了操作系统,避免了包括在用户态和核心态之间的切换,从用户空间到核心空间数据拷贝等在内的各种开销。因此,从发送和接收操作的路径上看,GM采用的是用户层通信。
DRIVER是GM中的一个重要部分。其最主要的功能是完成MCP的初始化,其次是提供一些辅助性的功能。以Linux + x86平台为例,DRIVER以Module的形式实现,当被加载到内核的时候,DRIVER同时完成一系列初始化工作,包括:查找并自动配置PCI网卡设备,把MCP从主机加载到LANai的EPROM上,并且对LANai进行初始化,对LANai发出reset指令,驱动MCP运行。LIBGM通过调用DRIVER的ioctl功能来完成各种辅助功能。
MCP 是GM最关键的部分,GM的其他功能都是在MCP的基础上构架起来的。MCP运行在Myrinet的网卡的LANai芯片上,它由DRIVER加载到LANai上。MCP借助LANai上的CPU和SRAM承担了大部分的通信处理工作,包括:在主机内存和LANai SRAM之间的数据DMA传送、数据包的拆分和组装、CRC校验、通信的应答管理、端口和令牌资源的分配、调度管理等。因此,主机方面的通信开销几乎为零。
网卡上的SRAM主要用作发送和接收数据的缓冲。MCP采取端口(port)、优先级(Priority)和发送/接收令牌(Token)等手段来实现资源的控制、分配和利用。对用户程序而言,网卡上只有固定数目的端口,每个端口有高低两个优先级,而每个端口有固定数目的发送和接收令牌。在发送或接收前,必须首先要打开端口,并申请发送或接收令牌,然后才能以某个优先级发送或者接收数据。与此机制相适应,采用了MCP的如图2所示的数据结构方式。
如图2,MCP的数据是以多级链表的方式组织的。第一级是表示各个主机之间的互连关系的双向链表;在该双向链表的每个节点处挂上一条表示通过该连接进行传输的第二级子端口双向链表SP;而在子端口双向链表的每个节点处,还挂接一条要通过该子端口进行数据发送的第三级发送令牌ST链表。用户程序发送数据时,只需要在这个多级链表结构中挂上发送令牌,因此开销很小,大概只需要1μs的处理时间。
3 GM的工作原理和编程模型
下面介绍GM的数据发送和接收的工作过程。实际程序中,通信前需要进行一系列预备工作:
· 选定一个通信端口,调用gm_open()打开该端口。gm_open()进行初始化工作,主要是打开设备文件(在Linux下一个GM端口对应一个设备文件),将LANai上的EPPROM和SRAM映射到主机的内存中去,以便用户程序的访问。
· 申请DMA存储区。GM使用LANai上的DMA引擎来实现主机内存与LANai SRAM之间的数据传输,所以主机方面的数据必须存放在DMA存储区中。
· 申请发送令牌。令牌是LANai的资源管理手段,每个端口都只有有限数量的发送令牌和接收令牌。获得令牌是使用LANai资源的保证,因此发送操作完成后,须马上释放令牌以保证后面的发送操作可以获得必要的LANai资源。
现在假设上述预备工作已经完成,一台主机调用gm_send()发送数据。gm_send()仅仅根据发送参数填写Send Token数据结构,并将其挂接到MCP的多级链表上。
MCP以轮询的方式不断检测多级链表,当发现有发送请求,就启动发送事件处理句柄来完成实际的发送操作。这个过程包括数据从主机到LANai SRAM的数据DMA传送、数据拆分、组包、CRC校验、发送到网络上。当一个发送请求被处理后,就会被转到另外的一个链表中,该链表维护所有已经处理但是尚未收到对方应答的发送请求。只有收到了对方的应答后,数据发送才算真正完成。
在接收方,当网卡采集到数据以后,会启动处理句柄对其处理,包括数据校验、重组、数据应答等,然后存放在SRAM缓存中等待以DMA的方式传送到主机内存中。这需要主机方面预先准备DMA内存和接收令牌,如果主机长时间不提供接收资源,那么这些数据将被丢弃。
4 GM的编程模型和API
GM用户程序一般都是用轮询的方式执行的。程序在进行了打开端口、申请内存等预备工作以后,就进入一个循环,在这个循环里,通过不断地调用gm_receive()来获取当前发生的事件,比如发送完成、有数据到达、系统出错等来决定相应的动作。下面是GM用户程序的通用模式:
事实上这种编程模式不太灵活,这也是GM的高性能运作模式所决定的。
LIBGM为GM用户程序提供了一整套的API接口。这套API提供了以下的功能:
· 系统初始化和释构;
· 数据发送,接收;
· DMA内存的申请,释放,映射;
· Token管理;
· 哈希存储管理;
· 获取和定制系统参数,比如获取节点ID,设定可接收数据包的最少长度。
参考文献
1 GM-1.1.3 source code,http://www.myri.com/
2 Nanette J.Boden,et al,. Myrinet: a gigabit-per-second local area network.[J]1999,29~36.