searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

NCCL的传输层分析(一)

2024-12-06 09:30:51
72
0

NCCL的传输层采用RDMA技术实现其数据的传输,具体的实现在net_ib.cc中。NCCL的数据发送流程可以简单的概括为以下几点:

1 在Recv端将一些metadata(addr,rkey)通过RDMA write写到send端,同时向QP中填充recv_wr,用来在本端感知到Send端数据发送的完成。

2 Send端根据Recv端发送过来的地址信息,将这些地址信息填充到wr中,表示要写到远端的哪块内存。同时填写本端自己的sge,表示自己要把本端的哪块内存写到对端。

3 填充完wr和sge等信息后,通过RDMA_write_with_imm将数据发送出去。

4 Send端和Recv端通过ibv_poll_cq,轮询收到的wc,当收到的wc的数量等于qp的数量,就表示已经成功发送,接收了所有的WR,本次发送接收完成,然后进行下一次的流程。

 

我们来看一下NCCL传输层的主要的数据结构(以NCCL 2.19.4为参考):

ncclIbRequest主要用于在Send端或者Recv端记录发送的信息

verbs中记录了各个reqs的信息,每个request都会做为verbs->reqs[MAX_REQUESTS]数组中的一个元素存储在其中。

type指明了该req属于Send端还是recv端,后续会通过req的type判断属于send端还是recv端,从而释放对应的资源。

events表明了发送带有IBV_SEND_SIGNALED数量,每一次通过ibv_poll_cq成功收到了wc时,events就相应减1,减到0时就表示成功poll到了所有的wc。

nreqs表示send端一次会发送的req数量,每个reqs对应一个wr。

 

ncclIbSendFifo是NCCL传输层中的一个重要数据结构,addr, rkey就是Recv端要告知Send端的地址信息

Send端和Recv端都会在各自两端维护一块大小为 MAX_REQUESTS * NCCL_NET_IB_MAX_RECVS * sizeof(struct ncclIbSendFifo)的内存。每次Recv端会将大小为NCCL_NET_IB_MAX_RECVS * sizeof(struct ncclIbSendFifo)的内存RDMA_WRITE到Send端,Send端就知道要往Recv端的哪块内存去写数据了。

 

SendComm和RecvComm,ncclIbRemFifo表明了Send端和Recv端的发送的一些数据信息

SendComm->fifo[MAX_REQUESTS][NCCL_NET_IB_MAX_RECVS]和ncclIbRemFifo中的elems[MAX_REQUESTS][NCCL_NET_IB_MAX_RECVS]就是上面讲到的在Send端和Recv端各自维护的一块大小为 MAX_REQUESTS * NCCL_NET_IB_MAX_RECVS * sizeof(struct ncclIbSendFifo)的内存。这两块内存在SendComm->fifoMr和RemFifo->mr中被注册为MR。目前MAX_REQUESTS在NCCL中规定为256,NCCL_NET_IB_MAX_RECVS规定为8.

 

可以将SendComm->fifo[MAX_REQUESTS][NCCL_NET_IB_MAX_RECVS]和elems[MAX_REQUESTS][NCCL_NET_IB_MAX_RECVS]理解为一个256 * 8的矩阵,每一行有8个元素,意味着一次Send最多发送8个reqs。Recv端每次会采用RDMA_WRITE发送矩阵中一行的元素到Send端,,告知Send端的地址信息,当Send端感知到Recv把地址信息写过来以后,就可以开始数据发送流程了。总之我们需要记住,NCCL中数据的发送是由接收端所驱动的。

 

 

SendComm->wrs[NCCL_NET_IB_MAX_RECVS+1]和Sendcomm->sges[NCCL_NET_IB_MAX_RECVS]表明了Send端要发送的WR和sge的信息。

SendComm->qps[NCCL_IB_MAX_QPS]和RecvComm->qps[NCCL_IB_MAX_QPS]中记录了Send端和Recv端所创建的QP信息,NCCL中最大允许创建128个QP。由于不同的QP使用不同的udp src_port。现有的RoCE网络中,交换机多采用ECMP五元组(src_ip,dest_ip,udp_src_port,udp_dest_port,ip协议)的方式进行数据包的转发,因此采用多QP传输数据可以起到负载均衡的效果。

 

本文介绍了NCCL传输层中的重要的几个数据结构,了解了这些数据结构中常见字段的含义后有助于我们更好地了解NCCL传输层中地数据发送与接收的流程实现,下一章我们将详细介绍一下NCCL传输层的数据发送与实现的具体流程。

 

0条评论
0 / 1000
h****n
6文章数
4粉丝数
h****n
6 文章 | 4 粉丝
h****n
6文章数
4粉丝数
h****n
6 文章 | 4 粉丝
原创

NCCL的传输层分析(一)

2024-12-06 09:30:51
72
0

NCCL的传输层采用RDMA技术实现其数据的传输,具体的实现在net_ib.cc中。NCCL的数据发送流程可以简单的概括为以下几点:

1 在Recv端将一些metadata(addr,rkey)通过RDMA write写到send端,同时向QP中填充recv_wr,用来在本端感知到Send端数据发送的完成。

2 Send端根据Recv端发送过来的地址信息,将这些地址信息填充到wr中,表示要写到远端的哪块内存。同时填写本端自己的sge,表示自己要把本端的哪块内存写到对端。

3 填充完wr和sge等信息后,通过RDMA_write_with_imm将数据发送出去。

4 Send端和Recv端通过ibv_poll_cq,轮询收到的wc,当收到的wc的数量等于qp的数量,就表示已经成功发送,接收了所有的WR,本次发送接收完成,然后进行下一次的流程。

 

我们来看一下NCCL传输层的主要的数据结构(以NCCL 2.19.4为参考):

ncclIbRequest主要用于在Send端或者Recv端记录发送的信息

verbs中记录了各个reqs的信息,每个request都会做为verbs->reqs[MAX_REQUESTS]数组中的一个元素存储在其中。

type指明了该req属于Send端还是recv端,后续会通过req的type判断属于send端还是recv端,从而释放对应的资源。

events表明了发送带有IBV_SEND_SIGNALED数量,每一次通过ibv_poll_cq成功收到了wc时,events就相应减1,减到0时就表示成功poll到了所有的wc。

nreqs表示send端一次会发送的req数量,每个reqs对应一个wr。

 

ncclIbSendFifo是NCCL传输层中的一个重要数据结构,addr, rkey就是Recv端要告知Send端的地址信息

Send端和Recv端都会在各自两端维护一块大小为 MAX_REQUESTS * NCCL_NET_IB_MAX_RECVS * sizeof(struct ncclIbSendFifo)的内存。每次Recv端会将大小为NCCL_NET_IB_MAX_RECVS * sizeof(struct ncclIbSendFifo)的内存RDMA_WRITE到Send端,Send端就知道要往Recv端的哪块内存去写数据了。

 

SendComm和RecvComm,ncclIbRemFifo表明了Send端和Recv端的发送的一些数据信息

SendComm->fifo[MAX_REQUESTS][NCCL_NET_IB_MAX_RECVS]和ncclIbRemFifo中的elems[MAX_REQUESTS][NCCL_NET_IB_MAX_RECVS]就是上面讲到的在Send端和Recv端各自维护的一块大小为 MAX_REQUESTS * NCCL_NET_IB_MAX_RECVS * sizeof(struct ncclIbSendFifo)的内存。这两块内存在SendComm->fifoMr和RemFifo->mr中被注册为MR。目前MAX_REQUESTS在NCCL中规定为256,NCCL_NET_IB_MAX_RECVS规定为8.

 

可以将SendComm->fifo[MAX_REQUESTS][NCCL_NET_IB_MAX_RECVS]和elems[MAX_REQUESTS][NCCL_NET_IB_MAX_RECVS]理解为一个256 * 8的矩阵,每一行有8个元素,意味着一次Send最多发送8个reqs。Recv端每次会采用RDMA_WRITE发送矩阵中一行的元素到Send端,,告知Send端的地址信息,当Send端感知到Recv把地址信息写过来以后,就可以开始数据发送流程了。总之我们需要记住,NCCL中数据的发送是由接收端所驱动的。

 

 

SendComm->wrs[NCCL_NET_IB_MAX_RECVS+1]和Sendcomm->sges[NCCL_NET_IB_MAX_RECVS]表明了Send端要发送的WR和sge的信息。

SendComm->qps[NCCL_IB_MAX_QPS]和RecvComm->qps[NCCL_IB_MAX_QPS]中记录了Send端和Recv端所创建的QP信息,NCCL中最大允许创建128个QP。由于不同的QP使用不同的udp src_port。现有的RoCE网络中,交换机多采用ECMP五元组(src_ip,dest_ip,udp_src_port,udp_dest_port,ip协议)的方式进行数据包的转发,因此采用多QP传输数据可以起到负载均衡的效果。

 

本文介绍了NCCL传输层中的重要的几个数据结构,了解了这些数据结构中常见字段的含义后有助于我们更好地了解NCCL传输层中地数据发送与接收的流程实现,下一章我们将详细介绍一下NCCL传输层的数据发送与实现的具体流程。

 

文章来自个人专栏
集合通信
5 文章 | 2 订阅
0条评论
0 / 1000
请输入你的评论
0
0