我是分布式计算的新手,我正在尝试运行一个使用 MPI 和 ROCm(在 GPU 上运行的 AMD 框架)的程序。
我用来运行程序的命令是
mpirun -np 4 ./a.out
但它默认运行在我机器上可用的 2 个 GPU 上。有没有办法让它只在单个 GPU 上运行,如果是的话如何?
提前致谢 :)
我是分布式计算的新手,我正在尝试运行一个使用 MPI 和 ROCm(在 GPU 上运行的 AMD 框架)的程序。
我用来运行程序的命令是
mpirun -np 4 ./a.out
但它默认运行在我机器上可用的 2 个 GPU 上。有没有办法让它只在单个 GPU 上运行,如果是的话如何?
提前致谢 :)
您可以通过设置一些环境变量来控制活动的 GPU(例如GPU_DEVICE_ORDINAL
,ROCR_VISIBLE_DEVICES
或HIP_VISIBLE_DEVICES
,请参阅此或此以获取更多详细信息)。
例如:
export HIP_VISIBLE_DEVICES=0
mpirun -np 4 ./a.out
# or
HIP_VISIBLE_DEVICES=0 mpirun -np 4 ./a.out
请注意,某些 MPI 实现不会导出所有环境变量,或者可能会重新加载您的 bashrc 或 cshrc。因此,使用 MPI 的语法设置 envvars 更安全:
# with openmpi
mpirun -x HIP_VISIBLE_DEVICES=0 -np 4 ./a.out
# or with mpich
mpiexec -env HIP_VISIBLE_DEVICES 0 -n 4 ./a.out
为了安全起见,将其添加到您的 C++ 代码中可能是个好主意:
#include <stdlib.h>
// ...
char* hip_visible_devices = getenv("HIP_VISIBLE_DEVICES");
if (hip_visible_devices) std::cout << "Running on GPUs: " << hip_visible_devices << std::endl;
else std::cout << "Running on all GPUs! " << std::endl;
(请注意,cuda 同时具有 envvar 和 C 函数 CudaSetDevice(id),我想知道 AMD 或 openCL 是否有等价物)。