GPUNetIO opensource

发布时间:2026/10/9 5:24:46

GPUNetIO opensource -1. 设置网卡临时 IP 地址cx5:sudoipaddradd192.168.0.150/24 dev enp3s0f0np0sudoiplinksetenp3s0f0np0 up##sudo ip route replace default via 192.168.1.1 dev enp3s0f0np00. 安装 DOCA安装 CUDA1. 安装 GDRCopy1.1. 编译安装# 下载源代码gitclone https://github.com/NVIDIA/gdrcopy.gitcdgdrcopy/gittaggitcheckout v2.6gitbranch# 编译 UMD 和 KMDmake# UMD 安装在本地查看安装的内容makeinstallprefix/home/ruler/ex_holoscan/tmp09_GDRCopy_gpunetio_open/localcd../local/ tree# UMD 安装到默认系统目录sudomakeinstallsudoldconfig# KMD 安装到系统目录sudomakedrv_instal lsmod|grepgdrlscatinsmod.sh# 将 KMD 插入内核./insmod.sh lsmod|grepgdr# 验证gdrcopy_sanity连个安装命令的打印供参考sudo make installsudo make drv_installrulerruler-Super-Server:~/ex_holoscan/tmp09_GDRCopy_gpunetio_open/gdrcopy$ sudo make install [sudo] password for ruler: awk: cmd. line:1: warning: regexp escape sequence \# is not a known regexp operator awk: cmd. line:1: warning: regexp escape sequence \# is not a known regexp operator awk: cmd. line:1: warning: regexp escape sequence \# is not a known regexp operator awk: cmd. line:1: warning: regexp escape sequence \# is not a known regexp operator cd src \ make LIB_MAJOR_VER2 LIB_MINOR_VER6 make[1]: Entering directory /home/ruler/ex_holoscan/tmp09_GDRCopy_gpunetio_open/gdrcopy/src [INFO] Compiler supports MOVDIR64B GDRAPI_ARCHX86 make[1]: Leaving directory /home/ruler/ex_holoscan/tmp09_GDRCopy_gpunetio_open/gdrcopy/src awk: cmd. line:1: warning: regexp escape sequence \# is not a known regexp operator awk: cmd. line:1: warning: regexp escape sequence \# is not a known regexp operator installing in /usr/local/lib /usr/local/include... src/libgdrapi.so.2.6 - /usr/local/lib/libgdrapi.so.2.6 include/gdrapi.h - /usr/local/include/gdrapi.h include/gdrconfig.h - /usr/local/include/gdrconfig.h cd tests \ make CUDA/usr/local/cuda make[1]: Entering directory /home/ruler/ex_holoscan/tmp09_GDRCopy_gpunetio_open/gdrcopy/tests make[1]: Nothing to be done for all. make[1]: Leaving directory /home/ruler/ex_holoscan/tmp09_GDRCopy_gpunetio_open/gdrcopy/tests cd tests make install DESTBIN/usr/local/bin make[1]: Entering directory /home/ruler/ex_holoscan/tmp09_GDRCopy_gpunetio_open/gdrcopy/tests installing exes in /usr/local/bin... gdrcopy_copybw - /usr/local/bin/gdrcopy_copybw gdrcopy_copylat - /usr/local/bin/gdrcopy_copylat gdrcopy_apiperf - /usr/local/bin/gdrcopy_apiperf gdrcopy_sanity - /usr/local/bin/gdrcopy_sanity gdrcopy_pplat - /usr/local/bin/gdrcopy_pplat cd /usr/local/bin \ ln -sf gdrcopy_copybw copybw \ ln -sf gdrcopy_copylat copylat \ ln -sf gdrcopy_apiperf apiperf \ ln -sf gdrcopy_sanity sanity make[1]: Leaving directory /home/ruler/ex_holoscan/tmp09_GDRCopy_gpunetio_open/gdrcopy/tests rulerruler-Super-Server:~/ex_holoscan/tmp09_GDRCopy_gpunetio_open/gdrcopy$ sudo make drv_install awk: cmd. line:1: warning: regexp escape sequence \# is not a known regexp operator awk: cmd. line:1: warning: regexp escape sequence \# is not a known regexp operator cd src/gdrdrv \ make make[1]: Entering directory /home/ruler/ex_holoscan/tmp09_GDRCopy_gpunetio_open/gdrcopy/src/gdrdrv Picking NVIDIA driver sources from NVIDIA_SRC_DIR/usr/src/nvidia-570.211.01/nvidia. If that does not meet your expectation, you might have a stale driver still around and that might cause problems. Setting NVIDIA_IS_OPENSOURCE Setting HAVE_VM_FLAGS_SETy Setting HAVE_PROC_OPSy make[2]: Entering directory /usr/src/linux-headers-6.8.0-138-generic warning: the compiler differs from the one used to build the kernel The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04.3) 12.3.0 You are using: gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04.3) 12.3.0 make[2]: Leaving directory /usr/src/linux-headers-6.8.0-138-generic make[1]: Leaving directory /home/ruler/ex_holoscan/tmp09_GDRCopy_gpunetio_open/gdrcopy/src/gdrdrv cd src/gdrdrv \ make install make[1]: Entering directory /home/ruler/ex_holoscan/tmp09_GDRCopy_gpunetio_open/gdrcopy/src/gdrdrv Picking NVIDIA driver sources from NVIDIA_SRC_DIR/usr/src/nvidia-570.211.01/nvidia. If that does not meet your expectation, you might have a stale driver still around and that might cause problems. Setting NVIDIA_IS_OPENSOURCE Setting HAVE_VM_FLAGS_SETy Setting HAVE_PROC_OPSy make[2]: Entering directory /usr/src/linux-headers-6.8.0-138-generic warning: the compiler differs from the one used to build the kernel The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04.3) 12.3.0 You are using: gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04.3) 12.3.0 make[2]: Leaving directory /usr/src/linux-headers-6.8.0-138-generic [ -d //lib/modules/6.8.0-138-generic//kernel/drivers/misc/ ] || mkdir -p //lib/modules/6.8.0-138-generic//kernel/drivers/misc/ cp gdrdrv.ko //lib/modules/6.8.0-138-generic//kernel/drivers/misc/ if [ ! -n ]; then /sbin/depmod -ae 6.8.0-138-generic; fi depmod: WARNING: -e needs -E or -F make[1]: Leaving directory /home/ruler/ex_holoscan/tmp09_GDRCopy_gpunetio_open/gdrcopy/src/gdrdrv rulerruler-Super-Server:~/ex_holoscan/tmp09_GDRCopy_gpunetio_open/gdrcopy$1.2. gdrcopy_sanity 的工作内容gdrcopy_sanity是 GDRCopyNVIDIA 的 GPUDirect 快速拷贝库自带的功能自检程序源码在 gdrcopy 仓库的tests/sanity.cpp。它的作用是对libgdrapi用户态库 gdrdrv内核模块做一轮完整的功能性验证确认安装和运行环境没问题。它具体测试的内容大致包括打开/初始化gdr_open()能否成功打开/dev/gdrdrv设备这一步就能暴露内核模块没加载的问题。显存映射在 GPU 上分配显存cuMemAlloc然后通过gdr_pin_buffer()gdr_map()把 GPU 显存映射到 CPU 用户空间再gdr_unmap()/gdr_unpin_buffer()解除。测试各种对齐/不对齐的偏移和大小。数据拷贝正确性gdr_copy_to_bar()CPU → GPU 显存写入gdr_copy_from_bar()GPU 显存 → CPU 读取用特定数据模式pattern写入再读回逐字节比对验证拷贝没有数据损坏。CPU 直接读写 BAR通过映射得到的指针直接 memcpy 访问 GPU 显存验证数据一致性。错误处理/边界条件比如重复映射、非法 unmap、未 pin 就 map 等非法调用是否被正确拒绝。多进程 fork 测试映射后 fork 子进程验证句柄和映射在进程间的行为符合预期映射不可跨进程继承等。怎么解读结果全部通过会输出一串PASSED常见失败点gdr_open失败 →gdrdrv内核模块没加载lsmod | grep gdrdrvpin/map 失败 → GPU 不支持 GPUDirect、驱动没开NVreg_EnableGpuFirmware相关设置或 IOMMU 开启导致问题数据校验失败 → 硬件/拓扑问题比如跨 NUMA、P2P 路径异常。简单说它就是 GDRCopy 的冒烟测试跑过全绿说明 GPUDirect 的低延迟 CPU↔GPU 显存拷贝通路是好的。2. 安装 GPUNetIO opensource2.1. 编译安装 GPUNetIO opensourcegitclone https://github.com/NVIDIA-DOCA/gpunetio.gitcdgpunetio/gitbranchgittaggitcheckout v4.0.1gitbranchmake-jlsmakeinstallinstall_examplesPREFIX/home/ruler/ex_holoscan/tmp09_GDRCopy_gpunetio_open/local_gpunetioCUDA_ARCH70cd../local_gpunetio/ treelscdexamples/lsldd gpunetio_verbs_write_latexportLD_LIBRARY_PATH/home/ruler/ex_holoscan/tmp09_GDRCopy_gpunetio_open/local_gpunetio/lib ldd gpunetio_verbs_write_lat ./gpunetio_verbs_write_lat ll ./gpunetio_verbs_put_bw ./gpunetio_verbs_write_bw ./gpunetio_verbs_write_bw--helpcd../..如果显卡是 V100需要制定gpu 架构目前默认是 CUDA_ARCH80cdgpunetiomakecleanmake-jCUDA_ARCH702.2. 运行测试程序2.2.1.step 1: 先启动 服务器端进入等待接收状态$DOCA_GPUNETIO_LOG6./gpunetio_verbs_put_bw-g41:00.0-dmlx5_0step2: 再启动 客户端客户端发送数据给服务器端后会立即退出。DOCA_GPUNETIO_LOG6./gpunetio_verbs_put_bw-g41:00.0-dmlx5_0-c192.168.0.101192.168.0.101 是一个 RoCEv2 网卡 的地址。客户端输出step3: CTLC 关掉 服务器程序会输出验证提示信息Validation successfull! Data received correctly from client如下图2.2.2.2.2.3.3. GDRCopy 与 GPUNetIO 的关系从源码里把整条链路都追完了结论如下。3.1. 先分清 GDRCopy 的两个组成部分GDRCopy 用户态库libgdrapi.so内核模块gdrdrv.ko分工是libgdrapi只是个传声筒把gdr_pin_buffer()/gdr_map()这类请求通过/dev/gdrdrv设备节点转给内核gdrdrv内核模块真正干活的部分——调用 NVIDIA 驱动的 P2P 接口nvidia_p2p_get_pages把 GPU 显存页面 pin 住并建立 CPU 地址空间到 GPU 显存的映射。所以什么时候需要安装内核模块的答案很直接只要有任何程序要执行把 GPU 显存映射给 CPU 访问这个操作gdrdrv就必须已加载insmod gdrdrv.koGDRCopy 源码树里有insmod.sh辅助脚本。模块没加载时/dev/gdrdrv不存在gdr_open()直接失败——libgdrapi 单独存在毫无意义。3.2. 开源 gpunetio 什么时候会用到它源码里的实际行为src/doca_gpunetio.cppdoca_gpunetio_gdrcopy.cpp3.2.1. 启动时探测不强制doca_gpu_create()时执行doca_gpu_gdrcopy_is_supported()dlopen(libgdrapi.so.2)gdr_open()。失败只是记日志GDRCopy usage is disabled库照常工作。还可用环境变量DOCA_GPUNETIO_DISABLE_GDRCOPY主动关掉。3.2.2. 唯一的触发点GPU-CPU 共享内存分配GDRCopy 的 pin/map 只在doca_gpu_mem_alloc()的DOCA_GPU_MEM_TYPE_GPU_CPU及GPU_CPU_DATA_DIRECT分支被调用——cudaMalloc 一块显存同时用 GDRCopy 映射出 CPU 侧指针。而谁会申请这种内存看doca_gpu_verbs_get_qp_dev()的逻辑QP 使用软件模拟 doorbell recordNO_DBR_SW_EMULATED或host 侧折叠 CQ时 → 必须 GPU_CPU 内存这正是CPU-assisted / CPU Proxy 模式示例里-p 1的路径GPU 填 WQE 后CPU 线程要读 GPU 显存里的队列状态和 doorbell record替 GPU 敲网卡门铃——CPU 访问 GPU 显存靠的就是 GDRCopy 映射此路径上有assert(support_gdrcopy)是真依赖启用data-directforce_pcie属性时同理。3.2.3. 主路径完全不用GPU SM 直接敲门铃的模式-p 2也是 AUTO 的优先选择中QP/CQ 用DOCA_GPU_MEM_TYPE_GPU纯显存类型分配doorbell 由 GPU 线程写 UAR 完成——整条 GDAKI 数据面不碰 GDRCopy。另外如果应用自己申请 GPU_CPU 内存而 GDRCopy 不可用代码会优雅降级为CPU 内存 cudaHostRegister性能换可用性。3.3. 结论场景需要gdrdrv内核模块编译 gpunetio不需要GDRCopy 是运行时 dlopenGPU SM 直敲门铃的 GDAKI默认/推荐路径-p 2不需要CPU-assisted 模式-p 1不支持 GPU 敲门铃的老平台需要且是硬依赖应用自己用GPU_CPU/>4. GPU QSFP28 FPGA 延迟测量中的 GPUNetIO 技术核实完了答案是其中两条的组合4.1. ✅ GPUNetIO CPU 控制路径初始化阶段由主机 CPU 用DOCA GPUNetIO 的 verbs CPU APIdoca_verbs_*系列完成打开网卡设备底层仍用ibv_get_device_list枚举但随即通过doca_verbs_bridge_verbs_context_create桥接成 DOCA verbs 上下文用doca_verbs_cq_create/doca_verbs_qp_create创建 CQ 和 QP队列内存用doca_gpu_mem_alloc分配在GPU 显存里最后通过doca_gpu_verbs_export_qp把 QP/CQ 句柄导出给 GPU交给 GPU 内核接管注意 QP 类型是DOCA_VERBS_QP_TYPE_UCUnreliable Connected——正对应论文里说的选择不可靠连接、不做重传。4.2. ✅ RDMA Verbs 双边two-sided的 GPUNetIO GPU 数据路径环回内核forward在 GPU 上的工作方式是接收GPU 线程直接轮询 RQ 的完成队列doca_gpu_dev_verbs_qp_get_cq_rq 解析mlx5_cqe64收到 FPGA 发来的 RoCE SEND 包然后repost_receive补充接收 WQE发送GPU 直接往 SQ 写 WQE、敲门铃doorbell把数据 SEND 回 FPGA收发都需要对端配合SEND/RECV 语义、FPGA 侧 HSB IP 按 RoCE QP 协议发包收包这是典型的双边操作。4.3. ❌ 未使用的四项Verbs CPU 控制路径没有用传统的纯 ibverbs/mlx5dv 手工建队列方式用的是 DOCA verbs 封装单边one-sided没有使用 RDMA Write/Read内核里没有任何 write/read 原语——单边语义里数据去向由发起方指定不适合这种FPGA 推数据、GPU 回发的对等交互Ethernet 数据路径不是裸二层以太网帧收发而是跑在 RoCEIB transport over Ethernet之上DMA 数据路径没有用 DOCA DMA 引擎做显存↔主存拷贝本来就不需要数据全程在显存概括CPU 用 GPUNetIODOCA verbs建链并把队列导出给 GPU之后 GPU 常驻内核以双边 SEND/RECV 方式直接驱动 ConnectX-7完成 RoCE 环回——控制路径和数据路径的分工正好体现了CPU 只初始化、GPU 全权收发的设计。
延伸阅读

更多相关文章

2026/10/9 5:19:46

systems-programming-rust-project - SKILL

name: systems-programming-rust-project description: “You are a Rust project architecture expert specializing in scaffolding production-ready Rust applications. Generate complete project structures with cargo tooling, proper module organization, testing” …

2026/10/9 5:19:46

tanstack-query-expert - SKILL

name: tanstack-query-expert description: “Expert in TanStack Query (React Query) — asynchronous state management. Covers data fetching, stale time configuration, mutations, optimistic updates, and Next.js App Router (SSR) integration.” risk: safe source…

2026/10/9 5:19:46

API开放平台重构实践:Java17+Vue3打造灵钥系统

这几年我做API网关和开放平台类的项目不算少,但真正让我下决心把整套技术栈推倒重来的,还是这个API灵钥系统。简单说,灵钥系统就是管理API Key的“管家”,在过去它只是给内部服务发钥匙、验钥匙,如今要改造成一个面向多…

2026/10/9 6:14:49

JSP进销存系统实战:Tomcat 9+MySQL 8.0部署与库存事务解析

简介:这是一套基于Java Web技术开发的JSP进销存管理系统完整源码包,面向Java初学者与中小型商贸企业信息化实践者,旨在解决手工管理进货、库存与销售环节中效率低、易出错、流程不清晰等痛点。资源包含183个文件,主体为77个JSP页面…

2026/10/9 6:14:49

GX Works2经交换机连接三菱PLC:通信原理、参数设置与排障方法

用GX Works2经交换机连接三菱PLC,这件事乍一看就是“插根网线、改个IP、点个连接”,但真正到设备现场,简简单单一步操作背后全是细节。我遇到过不少次这样的情况:电脑和PLC电都通了、交换机状态灯也在闪,GX Works2却一…

2026/10/9 6:14:49

RTM3004数字示波器评测:10bit ADC与深存储如何提升调试效率

干硬件调试这行,最郁闷的瞬间往往不是电路烧了,而是故障波形明明就跳了一下,你手上的示波器却死活没抓住。真抓住之后放大一看,满屏量化噪声,上升沿糊成一片,连是过冲还是振铃都分不清。这种事遇多了&#…

2026/10/9 6:14:48

从散件到直驱驾驶舱:openrig开源图纸DIY全记录

最早看到"openrig"这个词,是在某个模拟赛车交流群里。当时有人贴了一张铝型材结构的驾驶舱照片,配文说这是用开源图纸装出来的,整套骨架不到两千块。我第一反应是:这不就是把几根铝条拼起来嘛。直到自己照着图纸搭了一台…

2026/10/9 6:09:48

JSP+Servlet+Mysql客户管理系统实战:建表、连接池与避坑指南

简介:基于JSPServletMySQL实现的客户管理系统,采用B/S架构,适合Java Web初学者、课程设计或毕业设计参考。系统涵盖登录、客户管理、线索管理、交易管理、联系人管理、市场管理、数据统计与系统管理等模块,前后端分别使用Layui与J…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 0:04:27

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略当数万字的学位论文初稿经历开题、实验、问卷与多轮文献梳理最终成形时,绝大多数研究生都会面临一道全新的形式审查关卡:AIGC 疑似度排查。在高校毕业审核流程中,盲审前的文本检测通…

2026/10/9 0:04:27

食堂节能改造源头工厂,商用厨房设备焕新方案广受好评

商用厨房作为餐饮经营、单位供餐的核心后勤阵地,其设备配置、动线规划与运维体系直接决定后厨作业效率、运营成本与合规性。从基础的灶具、制冷存储设备,到油烟净化、水处理等配套系统,每一个环节的合理性都与食品安全、能耗管控、消防安全挂…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑