第1章:环境准备——硬件要求与软件栈安装

大家好,我是你们的NVSHMEM讲师。今天咱们聊聊环境准备这件事。

说实话,很多同学学NVSHMEM卡在第一步——环境没配好。我当年也踩过不少坑,有一次折腾了整整两天,最后发现是OpenMPI版本不兼容。嗯,今天我把这些经验都整理出来,你照着做就行。

1.1 硬件要求

NVSHMEM这东西,说白了就是让多个GPU能直接读写对方的内存。所以硬件上,你得满足两个条件:

  • NVIDIA GPU:支持CUDA的就行,但建议用Volta架构或更新的(比如V100、A100、H100)。老架构的GPU虽然也能跑,但性能差很多。
  • InfiniBand网络:这是GPU之间高速通信的关键。我个人习惯用Mellanox的网卡,比如ConnectX-5或ConnectX-6。没有InfiniBand?那NVSHMEM的很多高级特性就用不了。

重要提醒:NVSHMEM的通信效率高度依赖InfiniBand的RDMA能力。如果你只有以太网,建议先升级网络再继续。

1.2 软件栈概览

软件部分,你需要装三样东西:CUDA、NVSHMEM库、OpenMPI。它们的关系是这样的:

NVSHMEM 软件栈层次结构 你的应用程序(CUDA C/C++) NVSHMEM 库 CUDA Runtime OpenMPI NVIDIA GPU + InfiniBand 硬件

你想想看,NVSHMEM在中间层,上面接你的CUDA代码,下面靠CUDA驱动GPU、靠OpenMPI做节点间通信。这个结构很清晰,对吧?

1.3 安装步骤

1.3.1 安装CUDA

这个应该不用我多说了。去NVIDIA官网下载对应版本的CUDA Toolkit。我个人建议用CUDA 11.x或12.x,NVSHMEM对这些版本支持最好。

# 以Ubuntu 22.04为例
wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run
sudo sh cuda_12.2.0_535.54.03_linux.run

小技巧:安装时记得勾选「Driver」和「CUDA Toolkit」。我遇到过有人只装了驱动没装Toolkit,结果编译NVSHMEM时各种报错。

1.3.2 安装OpenMPI

NVSHMEM需要OpenMPI支持多进程通信。别用系统自带的mpich,那个不兼容。

# 下载OpenMPI 4.1.x
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.5.tar.gz
tar -xzf openmpi-4.1.5.tar.gz
cd openmpi-4.1.5

# 配置时一定要加上CUDA支持
./configure --with-cuda=/usr/local/cuda --prefix=/usr/local/openmpi
make -j$(nproc)
sudo make install

注意:我曾经因为忘记加--with-cuda参数,编译出来的OpenMPI根本不认识GPU。折腾了一下午才发现问题。你千万别犯这个错。

1.3.3 安装NVSHMEM库

NVSHMEM可以从NVIDIA的官方GitHub下载。我建议用最新的稳定版。

# 克隆仓库
git clone https://github.com/NVIDIA/nvshmem.git
cd nvshmem

# 编译
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/nvshmem \
         -DMPI_HOME=/usr/local/openmpi \
         -DCUDA_HOME=/usr/local/cuda
make -j$(nproc)
sudo make install

1.4 验证安装

装完了怎么知道对不对?写个简单的测试程序跑一下。

// test_nvshmem.cu
#include <nvshmem.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    int mype, npes;
    
    nvshmem_init();
    mype = nvshmem_my_pe();
    npes = nvshmem_n_pes();
    
    printf("Hello from PE %d of %d\n", mype, npes);
    
    nvshmem_finalize();
    return 0;
}

编译和运行:

# 编译
nvcc -I/usr/local/nvshmem/include -L/usr/local/nvshmem/lib -lnvshmem test_nvshmem.cu -o test_nvshmem

# 运行(用2个进程)
mpirun -np 2 ./test_nvshmem

如果看到类似下面的输出,说明环境配好了:

Hello from PE 0 of 2
Hello from PE 1 of 2

验证要点

  • 两个进程都能正常打印
  • 没有段错误或链接错误
  • PE编号从0开始连续

1.5 常见问题

问题 原因 解决办法
找不到nvshmem.h 头文件路径没加 编译时加-I/usr/local/nvshmem/include
链接错误:undefined reference 没链接库文件 -L/usr/local/nvshmem/lib -lnvshmem
mpirun找不到 OpenMPI没加到PATH export PATH=/usr/local/openmpi/bin:$PATH
运行时卡死 InfiniBand没配置好 检查ibstatus是否正常

嗯,环境准备就这些。说实话,这一步虽然繁琐,但配好了后面就顺了。我当年第一次配NVSHMEM时,光OpenMPI就编译了三次才成功。你按我的步骤来,应该一次过。

我的建议:配好环境后,把~/.bashrc里加上CUDA、OpenMPI、NVSHMEM的环境变量。这样每次开终端就不用重新设了。

专注资料整理