全国大学生 RDMA 编程竞赛介绍

嗯,先贴一段比赛官网的介绍:

全国大学生 RDMA 编程竞赛,旨在为大学生提供学习RDMA,并成为RDMA编程高手的绝佳机会。自2013年首次举办,大赛就吸引了来自全国各地的20余家高校报名参加。在2016年举办第四届大赛时,更是吸引了70余所高校报名参加,并受到了来自国际顶尖高性能计算、云计算和大数据领域专家的广泛关注和媒体的争相报道。

简单地说呢,RDMA 是一种相对于 TCP/IP 而言完全不同的网络通信模式。TCP 通信的基础设施是以太网卡网线交换机,响应地,RDMA 通信通常需要依靠 InfiniBand 卡InfiniBand 线材InfiniBand 交换机来完成组网和通信。

InfiniBand(后面简称 IB)卡通过 PCIE 接口与计算机互联。除了通信带宽、通信延迟都比以太网要好上几十倍这个量级以外,比较特别的是 IB 卡具有自主访问、读写内存的能力,因此它可以完成普通的 TCP 通信完全做不到功能,即我们这里需要的 RDMA(Remote Direct Memory Access)

RDMA

RDMA(Remote Direct Memory Access)技术全称远程直接数据存取,就是为了解决网络传输中服务器端数据处理的延迟而产生的。RDMA通过网络把数据直接写到对方机器的内存里,即将数据从一个系统快速移动到远程系统存储器中,而不对操作系统造成任何影响,这样就不需要用到多少计算机的处理功能。它消除了外部存储器复制和上下文切换操作,因而能解放内存带宽和CPU周期用于改进应用系统性能。

简单地说,利用 RDMA 技术,一个节点可以绕过 CPU,直接读写远程节点上的内存数据。

传统意义上的 DMA

直接内存访问(DMA)方式,是一种完全由硬件执行I/O交换的工作方式。在这种方式中, DMA 控制器从CPU 完全接管对总线的控制,数据交换不经过CPU ,而直接在内存和IO设备之间进行。DMA工作时,由DMA控制器向内存发出地址和控制信号,进行地址修改,对传送字的个数计数,并且以中断方式向CPU 报告传送操作的结束。

使用 DMA 方式的目的是减少大批量数据传输时 CPU 的开销。采用专用DMA 控制器(DMAC) 生成访存地址并控制访存过程,优点有操作均由硬件电路实现,传输速度快;CPU 基本不干预,仅在初始化和结束时参与,CPU 与外设并行工作,效率高。


更具体的原理就先不多说了,大家可以自己查资料看。

那么比赛比什么?

赛方每年会给一个原本基于 TCP/IP 来进行多机通信的软件,要求你修改源代码,把这个软件改成基于 RDMA 的通信方式

17年是给了 MXNet,16年是 TensorFlow,15年是 Memcached。

每年的应用基本上都是一些行业中特别热门的软件。

那么把大象装进冰箱需要几个步骤?3步。

  1. 首先需要分析软件源代码,理解它的计算和多节点通信的方式;
  2. 修改代码,把原来基于 TCP/IP 的 Socket 的通信拿掉,换上 RDMA 的通信方式;
  3. 对修改的成果做测试,对比性能等等参数,写一份英文报告

代码好改吗?

是不是我找到原本用 TCP 写的例如sendmsgrecvmsgreadv等等这种 Socket 通信函数用 RDMA 的接口换掉就好啦?

还真不是这么简单。


首先,RDMA 和 TCP 的通信逻辑、整个通信过程会有根本性的区别。

TCP 通信的一般方式是(简化之后):

  • 设立 socket 通道
  • 握手等等操作建立连接
  • 一边 send 另一边 recv 然后数据就收到了

RDMA 的工作模式是基于一个完成队列的形式:

  • 首先建立 TCP 连接
  • 通过 TCP 通道交换双方的一些参数信息
  • 把对方的关键参数注册到自己的 IB 卡上,这样双方的 RDMA 连接就建立完成了
  • 接下来还需要创建完成队列、保护域等等一系列 RDMA 通信用的东西
  • 需要被 IB 卡操作的内存区域还需要提前注册到 IB 卡上,只有这样做了,才能保证 IB 卡有读写某一块内存地址的权限,也能保证这块内存不会被操作系统换页出去
  • 接收端向自己的等待队列提交一个接收请求
  • 发送端向自己的等待队列提交一个发送请求,之后 IB 卡会处理这条请求,根据其中的一些信息完成访问远程服务器上内存数据的操作,完成之后向自己的完成队列提交一条完成请求的信息,这时可以通过一些 API 来查询到完成队列里面的内容
  • 接收端处理完之后,也会向自己的完成队列里面提交一条完成请求的信息,这时可以通过一些 API 来查询到完成队列里面的内容
  • 把上面这个过程写在代码逻辑中,我们需要做的就是提交请求到 IB 卡上,然后后面的通信就不用管了,接下来要做的只是查询完成队列,查到完成队列中有新的内容了,就知道了刚刚的任务是完成了还是有出错的

难点大概有这么几个:

  • 要求参赛者自己理解目标软件的计算、通信模式,自己找到可以修改的源代码(赛方在目标软件方面基本上没办法提供任何帮助,给的一些资料和培训只是关于 RDMA 的基础知识)
  • 把 TCP 换成 RDMA 并不是简单地换几个函数接口就好了,其中基本都是要涉及到通信逻辑、如何组织内存管理等等的问题
  • 通信逻辑的设计可能对最终性能的影响也会比较大,例如我们基本每年成功改出来的第一个版本,光让原本的软件逻辑跑对就已经很不错了,都是没什么性能提升的,甚至可能会更慢

关于报告(论文)

赛方要求用英文整理参赛的所有工作,最后比赛没有答辩什么的,就是在截止日期把软件源代码和报告交上去就行了。评判的标准首先当然是优化的效果了(客观),而另一方面报告的质量也是作为考察的一部分(主观)。写的好的报告甚至就已经是一篇不错的应用论文了。

报告中大概需要涉及到的内容有:

  • 对软件的分析
  • 你的 RDMA 改版的设计思路(核心)
  • 测试结果(重点)

测试具体要怎么做,也是由参赛者自己选择。你可以选个自己测下来效果最好的测试算例的结果写上去,当然最好的结果是你的优化工作要对各种不同的算例都能够有比较好的效果,这些都会影响到最后的结果评判。提交报告和源代码过去之后赛方会拿你的代码进行对比测试,他们会选什么样的算例来作为测试标准就不知道了。

通常情况下,需要对比的是 TCP/IP 原版、IPoIB 以及 RDMA 版的性能。IPoIB(IP over Infiniband) 技术是 InfiniBand 自带的,即把 TCP/IP 包封装成 IB 包,走 IB 链路完成传输,可以利用上 IB 网络高带宽、低延迟的特性,但是 RDMA 的一些例如绕过 CPU 直接读写内存的特性就没办法享受到了,改的比较好的 RDMA 版本性能应该是要在 IPoIB 的基础上再往上提的。

关于 IPoIB 这点:

假定两台机器之间同时配有以太网络和 IB 网络,以太网的 IP 地址分别是192.168.0.1192.168.0.2,IB 网络的 IP 地址是10.0.0.110.0.0.2

当我们用192网段的 IP 地址进行通信时,数据包走的是以太网络;当用10网段的 IP 地址进行通信时,数据包走的是 IB 网络,即 IPoIB。

那完成了 RDMA 之后呢?其实用这两个网段都可以,因为 RDMA 通信只在连接的一开始才需要走常规的通信通道交换数据,等 RDMA 连接建立之后,整个通信过程就是基于两端绑定好的 IB 卡直接完成的了,中间已经不再涉及到跟 IP 数据包有关的东西了。

参加这个比赛需要什么样的能力?

基本要求跟前面 技能储备要求 中列的一样,另外要求能有阅读代码、编写代码的能力,这几年用到的都是 C 和 C++。

要求有良好的心理素质,不要被目标软件动辄几十万的代码量给吓到。

其他的就是网络方面的知识、多线程编程等等。


其实上面这些基础如果不太好的同学也不用过于担心,我们前面几届很多一开始参赛的同学都不是说很精通这些方面,但是如果你能真正地把整个参赛过程坚持下来,从中你会学到很多东西。

一些参考资料


祝未来参赛的同学都能有所收获,取的好成绩。