【问题记录】如何编译nv_peer_memory模块?依赖OFED的4个目录和2类文件?如何解决没有rdma/peer_mem.h文件?

背景

GDR:GPUDirect RDMA。这项新技术在 GPU 内存之间直接与 NVIDIA HCA/NIC 设备之间提供直接的 P2P(点对点)数据路径。这显着降低了 GPU-GPU 通信延迟,并完全减轻了 CPU 的负担。nv_peer_memory模块是网卡提供给GPU使用GDR技术的模块,介于GPU驱动和OFED之间。 nv_peer_memory依赖OFED的接口。

代码仓库

https://github.com/Mellanox/nv_peer_memory

编译安装方法

bash 复制代码
git clone https://github.com/Mellanox/nv_peer_memory.git
cd nv_peer_memory
make -j

编译问题

nv_peer_mem.c:46:10: 致命错误:rdma/peer_mem.h:没有那个文件或目录

问题现象:

问题原因:

可以看到前面有编译告警:

bash 复制代码
/root/workspace/nv_peer_memory/Makefile:17: "WARNING: Compilation might fail against Inbox InfiniBand Stack as it might lack needed support; in such cases you need to install MLNX_OFED package first."

上面<rdma/peer_mem.h>这个文件是由Mellanox网卡驱动OFED提供的。

根据nv_peer_memory模块的编译Makefile得知,nv_peer_memory编译依赖OFED放到指定的位置,具体是:

bash 复制代码
# nv_peer_memory/Makefile文件
KVER := $(shell uname -r) #比如4.19.91-26.an8.x86_64
OFA_ARCH := $(shell uname -m) #比如x86_64 

OFA_DIR ?= /usr/src/ofa_kernel
OFA_CANDIDATES = $(OFA_DIR)/$(OFA_ARCH)/$(KVER) $(OFA_DIR)/$(KVER) $(OFA_DIR)/default /var/lib/dkms/mlnx-ofed-kernel
OFA_KERNEL ?= $(shell for d in $(OFA_CANDIDATES); do if [ -d "$$d" ]; then echo "$$d"; exit 0; fi; done; echo $(OFA_DIR))
...
ccflags-y += -I$(OFA_KERNEL)/include/ -I$(OFA_KERNEL)/include/rdma
...
        /bin/cp -f $(OFA_KERNEL)/Module.symvers my.symvers
...
cat nv.symvers >> my.symvers
make -C $(KDIR) $(MAKE_PARAMS) M=$(PWD) KBUILD_EXTRA_SYMBOLS="$(PWD)/my.symvers" modules

根据文件可以得知,nv_peer_memory编译依赖OFED的Module.symvers以及OFED的头文件:-I$(OFA_KERNEL)/include/-I$(OFA_KERNEL)/include/rdma这两个目录。

并且nv_peer_memory会从4个可能存在OFED驱动的目录中去寻找OFED相关的2类文件

  • /usr/src/ofa_kernel/x86_64/4.19.91-26.an8.x86_64
  • /usr/src/ofa_kernel/4.19.91-26.an8.x86_64
  • /usr/src/ofa_kernel/default
  • /var/lib/dkms/mlnx-ofed-kernel
    如果这些目录没有OFED并且没有编译就会出现异常。没有OFED会造成没有头文件,也就是上面的问题,没有编译会造成没有Module.symvers文件。
    可以看一下编译后的效果

如何解决,参考兄弟篇Mellanox OFED编译方法详细步骤,然后把OFED的编译目录放到/usr/src/ofa_kernel/default中,比如安装后的效果:

可以看到依赖的头文件路径在这里:

其他

nv_peer_memory依赖OFED的哪些接口?

ib_core.ko ib_unregister_peer_memory_client nv_peer_memory ib_register_peer_memory_client

bash 复制代码
void *
ib_register_peer_memory_client(const struct peer_memory_client *peer_client,
			       invalidate_peer_memory *invalidate_callback);
void ib_unregister_peer_memory_client(void *reg_handle);


nv_peer_memory信息:

可以看到依赖2个模块 ib_core,nvidia

相关推荐
weiwei228443 天前
NVIDIA Kernel级性能分析工具Nsight Compute入门详解
gpu·cuda·nsight compute
云道轩4 天前
阿里云和华为云Rocky LINUX 9.X镜像就绪及低端可用英伟达GPU
阿里云·华为云·云计算·gpu·rocky linux
杰克逊的日记7 天前
gpu与cpu各厂商的优劣
运维·cpu·gpu
weiwei2284415 天前
NVIDIA系统级性能分析工具Nsight Systems入门详解
gpu·cuda·nsight systems
weiwei2284422 天前
CUDA编程初探
gpu·cuda
数据智能老司机23 天前
GPU 编程实战——使用 PyCUDA 与 CuPy 功能
人工智能·python·gpu
都都学算法1 个月前
【CUDA编程】hello world 级入门(一)
gpu
杰克逊的日记1 个月前
GPU运维常见问题处理
linux·运维·gpu
胡耀超1 个月前
基于Docker的GPU版本飞桨PaddleOCR部署深度指南(国内镜像)2025年7月底测试好用:从理论到实践的完整技术方案
运维·python·docker·容器·ocr·paddlepaddle·gpu
雪碧聊技术1 个月前
CPU(中央处理器)和GPU(图形处理器)的区别
人工智能·cpu·gpu·中央处理器·图形处理器