第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代码,下面靠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的环境变量。这样每次开终端就不用重新设了。