Quadro P620 GPUDirect RDMA固定地址超出范围问题求助
问题分析与解决方案
核心原因:混淆GPU本地显存偏移与PCIe总线地址
你看到的nvidia_p2p_get_pages()返回的2.7GB地址是PCIe总线域地址,不是GPU本地显存的物理偏移量,和Quadro P620的2GB实际显存容量没有直接对应关系。NVIDIA驱动会把GPU显存映射到PCIe总线上的一个地址段中,这个地址段的大小可能大于实际显存(比如为了对齐2的幂次,2GB显存会映射到4GB的PCIe BAR空间),所以地址超出2GB是正常现象,关键是这个地址是否能被FPGA的PCIe控制器正确识别和访问。
可能的问题点及排查步骤
自定义驱动的GPUDirect RDMA流程不完整
仅调用nvidia_p2p_get_pages()是不够的,必须配套完成DMA映射流程:- 用户态用
cuMemAlloc()分配内存后,通过cuMemGetAddressRange()获取用户态虚拟地址,再传递给内核驱动。 - 驱动中先将用户态地址转换为内核可访问的页(用
pin_user_pages()),再调用nvidia_p2p_get_pages()获取GPU内存页信息。 - 最后调用
nvidia_p2p_dma_map_pages()将这些页映射为FPGA可访问的DMA总线地址,而非直接使用返回的bus_address(需适配DMA掩码、端序等硬件要求)。
- 用户态用
FPGA的PCIe地址解码范围未覆盖目标地址
用lspci -vvv查看Quadro P620的BAR配置,确认返回的2.7GB地址落在GPU的某个BAR空间内。同时检查FPGA的PCIe控制器配置,确保其地址解码掩码包含该地址段,否则会出现DMA访问失败。驱动DMA掩码配置不足
确保自定义驱动已设置64位DMA掩码:dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64));虽然2.7GB处于32位地址范围内,但64位掩码能兼容更大的总线地址,避免后续扩展时出现问题。
验证与调试建议
- 打印
nvidia_p2p_get_pages()返回的每个页的bus_address,确认地址连续且落在GPU BAR范围内。 - 用
nvidia-smi检查用户态分配的64KB显存是否已正确预留,排除内存分配失败的隐性问题。 - 先尝试用4KB小内存块做DMA测试,逐步排查是否是内存大小导致的映射问题。
关于显存地址空间的疑问
不需要Quadro GPU的显存地址空间达到4GB。GPU实际显存容量和PCIe总线地址空间是独立的两个概念:总线地址是驱动映射出来的虚拟地址段,只要FPGA能解码该地址,且驱动已将对应显存页映射到总线上,即可正常访问。
内容的提问来源于stack exchange,提问作者SkyCyborg
相关产品推荐
相关产品推荐

