RDMA传输相关代码的问题整理

本文主要讨论了在没有RDMA硬件网卡的情况下,如何通过softiWARP进行软件模拟RDMA传输,以及在编译和运行过程中遇到的问题。在编译阶段,通过添加-lrdmacm和-libverbs解决链接库错误。运行时,由于goto语句顺序错误导致segmentfault,调整顺序后问题解决。此外,文章还探讨了代码中的一些疑问,如while循环中条件判断的逻辑、ibv_query_qp()的作用、out代码块顺序的设计原因以及资源关闭的实现。同时,解释了rdma_listen()和rdma_request()执行的时机,以及设置IBV_SEND_INLINE标志的原因。最后,阐述了操作码与QP传输服务类型的关系,以及libibverbs和librdmacm的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、尝试安装softiWARP进行软件模拟RDMA传输,在没有硬件网卡的前提下进行实验。编译的时候遇到了问题。

直接编译会报错,“undefined reference to xxx”,意味着缺少链接库文件,所以加上-lrdmacm选项,但是依然报错。

根据提示,发现少了个libibverbs.so动态库的链接,所以再加上-libverbs即可。

2、编译成功,运行时出现segmentfault,仔细比对代码,发现是因为goto语句顺序有误。对于程序来说,如果某一时刻执行了goto语句,程序就会跳到对应的代码处顺序执行,在程序中,所有的goto语句都是顺序出现的,对应着不同的阶段,如果按照顺序放置goto语句,比如out_free_addrinfo,out_destroy_listen_ep,out_destroy_accept_ep,假如需要跳到out_free_addrinfo处,那么会继续向下执行,而此时并没有建立连接,所以out_destroy_accept_ep就是错误的。但是如果倒序放置,那么就不会报错,因为执行的goto语句对应的释放资源都是跳转之前已有的资源。这是一个小细节。也解决了之前的疑惑,为什么这些goto语句是倒序放置。

3、关于代码的几点疑惑

1)为什么最后的while循环中,if(ret<0)之后不再跳转了out_disconnect?

对于rdma_get_send_comp()和rdma_get_recv_comp()来说,成功返回0或1,失败返回-1。

第一个while中,如果ret=0,就一直循环,如果跳出,要么是1,要么是-1,如果是-1,那么输出错误信息,并且跳转到out_disconnect,逐个释放资源,如果是1,那么表示正常,继续向下执行其它操作。

最后一个while中,如果ret=0,就一直循环,如果跳出,要么是1,要么是-1,如果是-1,那么输出错误信息,理论上需要跳转到out_disconnect,但是跳不跳转结果都一样所以没有跳转,如果是1,那么因为这里已经执行到了最后,所以将ret赋值为0,返回,表示正常。

2)为什么服务器要执行ibv_query_qp()?

<think>嗯,用户现在想了解DMA和RDMA在硬件开发或系统架构设计中的区别。我之前回答过关于POD类型在硬件中的应用,其中提到了DMA数据传输的场景,比如FPGA与CPU之间用memcpy的例子,还有引用了RDMA的内容,所以可能需要结合之前的讨论来展开。 首先,我得回忆一下DMA的基本概念。DMA,直接内存访问,允许外设直接访问内存而不需要CPU介入,这样可以减少CPU负担,提高效率。这在嵌入式系统中很常见,比如传感器数据传输到内存,或者磁盘控制器读写数据。 而RDMA,远程直接内存访问,应该是在网络环境中使用的,允许不同计算机之间直接访问内存,同样不需要CPU参与。引用[1]里提到RDMA需要专门的硬件支持,比如RNIC,并且使用内存区域(MR)来让RNIC直接操作数据。这可能涉及到低延迟和高吞吐量的网络通信,比如在数据中心或高性能计算中使用。 用户可能是在设计分布式系统或者需要高效数据传输的硬件架构,所以需要比较这两种技术的适用场景。他们可能关心两者的工作原理、硬件支持、性能差异以及应用场景的不同。 接下来,我需要整理两者的区别,可能从定义、硬件支持、数据路径、延迟、应用场景等方面展开。比如,DMA是本地总线级别的,而RDMA是网络级别的;DMA通常用于单机内部,而RDMA用于跨机器;RDMA需要专门的网卡,而DMA可能只需要DMA控制器;延迟方面,RDMA可能更低,因为绕过了操作系统协议栈。 还要注意用户提到的硬件开发或系统架构设计,所以可能需要提到在SoC设计中如何集成DMA控制器,或者在高性能计算集群中如何使用RDMA优化通信。同时结合之前提到的POD类型,因为POD的数据结构在DMA/RDMA传输中更高效,内存布局明确,适合直接拷贝。 另外,引用[2]提到AVR和ARM的区别,虽然用户的问题是关于DMA和RDMA的,但可能需要注意用户是否有嵌入式背景,可能需要举例说明DMA在微控制器中的应用,比如AVR或ARM中的DMA使用案例,而RDMA可能更多在服务器或数据中心环境中。 需要确保解释清晰,结构分明,分点比较两者的差异,并给出应用实例,帮助用户理解何时选择DMA,何时选择RDMA。同时,可能还需要提到协议栈的开销,比如RDMA如何减少CPU干预,而DMA在本地设备中的作用。 最后,检查是否有遗漏的关键点,比如是否涉及缓存一致性、内存注册、错误处理等方面的差异。确保引用之前的回答内容,比如POD结构在数据传输中的重要性,以及之前提到的内存映射硬件寄存器的例子,以保持连贯性。</think>在硬件开发和系统架构设计中,DMA(直接内存访问)与RDMA(远程直接内存访问)是两种关键的数据传输技术,以下是它们的核心区别及典型应用场景: --- ### **1. 核心定义与作用域** | **特性** | **DMA** | **RDMA** | |-----------------|----------------------------------|-----------------------------------| | **作用范围** | 单机内部(本地总线级) | 跨主机(网络级) | | **数据路径** | 本地外设↔内存(如磁盘、GPU显存) | 远端主机内存↔本地内存(通过网络) | | **协议依赖** | 依赖本地总线协议(如AXI、PCIe) | 依赖网络协议(如InfiniBand、RoCE)| | **典型延迟** | 纳秒至微秒级 | 微秒至亚毫秒级(受网络延迟限制) | --- ### **2. 硬件实现差异** #### **DMA** - **控制器位置**:集成在SoC/外设中(如STM32的DMA控制器) ```c // STM32中配置DMA传输的示例 DMA_HandleTypeDef hdma; hdma.Instance = DMA1_Channel1; hdma.Init.Direction = DMA_MEMORY_TO_PERIPH; // 内存到外设 HAL_DMA_Init(&hdma); ``` - **硬件依赖**:需要总线仲裁器和DMA通道支持(如ARM的AMBA总线) - **优化目标**:减少CPU负载,提升本地数据传输效率[^1]。 #### **RDMA** - **硬件支持**:依赖专用RDMA网卡(RNIC),如Mellanox ConnectX系列 - **内存注册**:需预先注册内存区域(Memory Region, MR),供RNIC直接访问(如引用[1]中所述): ```c // RDMA编程中的内存注册示例(伪代码) struct ibv_mr *mr = ibv_reg_mr(pd, buffer, size, IBV_ACCESS_REMOTE_WRITE); ``` - **网络卸载**:RNIC直接处理网络协议栈(如TCP/IP卸载),降低CPU占用率[^1]。 --- ### **3. 系统架构设计影响** #### **DMA的典型应用** 1. **嵌入式系统**: - 传感器数据采集(如通过SPI/I2C DMA传输至内存) - 图形渲染(GPU通过DMA读取纹理数据) 2. **存储系统**: - NVMe SSD通过PCIe DMA直接读写主机内存 #### **RDMA的典型应用** 1. **分布式存储**: - Ceph、分布式数据库通过RDMA实现跨节点低延迟数据同步 2. **高性能计算**: - MPI通信中利用RDMA加速进程间数据传输(替代传统Socket) 3. **云计算**: - 虚拟机热迁移时通过RDMA快速复制内存状态 --- ### **4. 性能对比与权衡** | **维度** | **DMA** | **RDMA** | |----------------|----------------------------------|-----------------------------------| | **吞吐量** | 受限于本地总线带宽(如PCIe 4.0的16 GT/s) | 受限于网络带宽(如100Gbps InfiniBand) | | **CPU开销** | 仅需初始配置,传输过程零拷贝 | 需注册内存,但传输过程零拷贝 | | **适用场景** | 单机内设备协作 | 跨主机低延迟通信(如分布式AI训练) | --- ### **5. 设计选择建议** - **选择DMA**:当需要优化单机内硬件组件(如FPGA加速卡与CPU)之间的数据传输时。 - **选择RDMA**:在分布式系统中要求跨节点高吞吐、低延迟通信的场景(如金融交易系统、超算集群)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值