微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于Linux数据链路层的MPI集群通信机制的设计与实现

基于Linux数据链路层的MPI集群通信机制的设计与实现

时间:08-17 来源:3721RD 点击:

在集群计算系统中,随着系统规模的增大,通信效率是影响整个系统获得高性能的关键因素之一。而随着局域网传输性能的快速提高,Myrinet、Gigabit Ethernet和Infiniband等千兆位网络设备已被广泛使用,当前影响集群节点间通信性能的瓶颈已经从通信硬件的传送开销转移到了通信处理软件的开销上,所以采用优化的通信协议是降低通信成本、提高结点间通信的有效手段。

在当前的集群通信应用中,普遍采用两类通信结构,即核心级通信和用户级通信。但由于它们设计的初衷并非是针对集群通信,所以并不适合当前集群环境的特点。为此,本文通过分析这两类通信结构的特点,提出了以核心级通信为基础,旁路内核中IP层及以上协议层,实现数据链路层直接与MPI通道接口层通信的新机制,并通过实验验证,为传统集群的升级改造提供一种新的无连接、无差错控制,开销小、延时低的通信机制。

1 基于数据链路层的集群通信结构的提出

目前各种通信协议普遍采用两种通信结构,即核心级通信和用户级通信[1]。

1.1 核心级通信

在核心级通信中,操作系统内核控制着所有消息传递中的发送与接收处理,并且负责它们的缓冲管理和通信协议的实现,设备驱动程序也是通过内核来完成所有的硬件支持与协议软件处理的任务,如图1所示。在通信过程中,系统要经过多次内核态与用户态之间的数据拷贝才能够实现数据的传送。有数据表明[2],一般奔腾处理器的内存拷贝速率平均为70 Mb/s,但是由于操作系统在交换页面时的 I/O 数据传送都是阻塞操作,若出现缺页中断,其时延将会更大,所以频繁的内存拷贝操作的开销将是影响整体性能的瓶颈所在。因此,对于通信效率要求较高的集群计算系统,核心级通信是不适合的。
\

1.2 用户级通信

在用户级通信中,操作系统内核将网络接口控制器NIC(Network Interface Controller)的寄存器和存储器映射到用户地址空间,允许用户进程旁路操作系统内核从直接访问NIC,直接将数据从用户空间发送到网络中进行传输。通信事件处理的触发采用查询方式而不是中断方式,由于旁路操作系统内核,使得整个通信过程省掉了执行系统调用、用户态与核心态之间的数据拷贝及用户与内核的上下文切换等软件上的开销,进而减少对主机CPU资源的占用,缩短通信操作的关键路径,实现通信与计算的重叠。如图2所示[3]。
\
但是,采用用户级通信协议时,通信过程中的所有操作均在用户空间中进行,当用户程序出错或有恶意用户进行破坏时,系统就很容易被破坏。这是因为系统数据结构中不仅包含本进程(或并行任务)及其相关信息,同时也包含与本进程无关的其他进程(或并行任务)的相关信息。若某一用户(并行任务)出错或失误,都将会影响到其他用户(并行任务)的执行,因而很难保证系统的安全性和可靠性,也无法保证并行任务间的相互独立性。

1.3 基于数据链路层通信

为了既能保证系统安全、可靠以及并行任务间相互独立,同时又能降低通信成本,本文提出了一种以核心级通信为基础的基于数据链路层的通信结构,即在操作系统内核(以Linux内核为例)中旁路IP层、INET Socke层和BSD Socket层,使得数据链路层直接与应用程序的通道接口层通信。如图3所示。
\
图3中阴影部分表示通信关键路径上数据链路层。在该通信结构下,系统在通信的关键路径上将通过内存映射和内存拷贝两种技术实现通信。在发送消息时,系统通过内存映射技术将消息映射到内核中的缓冲区,注册协议标识,并调用数据链路层函数对其进行封包发送;在接收消息时,系统通过数据链路层的MAC地址进行寻址、接收消息,并通过内存拷贝直接将消息传送到用户空间中的应用程序,实现点到点通信。

与用户级通信结构相比,基于数据链路层的通信结构在通信关键路径上只增加了一次内存拷贝的开销。同时,由于保留了数据链路层的通信,进而为系统的安全性、可靠性和并行任务间的独立性提供了保障。此外,该通信结构可以屏蔽系统的硬件信息,使得在应用程序中不再出现与系统通信硬件有关的操作。

与核心级通信结构相比,该通信结构在通信关键路径上减少了协议处理开销、数据拷贝次数和冗余的差错校验,进而提高了系统的通信效率。

2 MPI的通信

MPI(Message Passing Interface)是为基于消息传递的并行程序设计提供一个高效、可扩展、统一的编程环境,是目前主流的并行编程模式,也是分布式并行系统的主要编程环境。在集群环境中MPI并行程序设计中使用的通信模式有阻塞通信、非阻塞通信和组通信,其中阻塞通信和非阻塞通信属于点对点通信,而点对点通信也正是MPI其他通信的基础。

在阻塞通信中,当发送调用函数MPI_Send后即被阻塞,这时,系统会将发送缓冲区中的数据拷贝到系统缓冲区,由系统负责发送消息,而发送者的操作只在拷贝操作完成时结束并返回,不必等待发送完成。但是,如果系统缓冲区不足或消息过长,导致拷贝失败,则发送者将被阻塞,直到消息发送完成为止;同样,当接收者在调用函数MPI_Recv后会被阻塞,直至收到匹配的消息为止[3]。

非阻塞通信主要是通过实现计算与通信的重叠,进而提高整个程序的执行效率。对于非阻塞通信,不必等到通信操作完全结束后才可返回,而是由特定的通信硬件完成通信操作。在通信硬件执行通信操作的同时,处理机可以同时进行计算操作,这样便实现了通信与计算的重叠。发送者调用函数MPI_Isend或接收者调用数MPI_Irecv后,处理机便可执行其他计算任务。在发送(接收)操作开始时,发送者(接收者)使用请求句柄(request handler),MPI通过检查请求来决定发送(接收)操作是否完成,发送者(接收者)通过调用MPI_Test来确定发送(接收)操作是否完成。在发送或接收操作期间,发送者不能更改发送缓冲区中的内容,接收者也不能使用接收缓冲区中的内容。若发送者(接收者)调用函数MPI_Wait,则发送者(接收者)会被阻塞,直到发送(接收)操作完成才能返回[4]。

由此可知,MPI点到点通信在发送缓冲区、接收缓冲区和内核中的系统缓冲区之间进行传递,并由内核发送或接收系统缓冲区中的消息,本文提出的新通信机制就是围绕着系统缓冲区展开的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top