我是分布式计算的新手,我正在尝试运行一个使用MPI和ROCm(AMD框架在GPU上运行的程序)。
我用来运行程序的命令是mpirun -np 4 ./a.out
但是默认情况下,它在我的计算机上可用的2个GPU上运行。有没有一种方法可以使其仅在单个GPU上运行,如果可以,怎么办?
预先感谢:)
您可以通过设置一些环境变量来控制活动GPU(例如GPU_DEVICE_ORDINAL
,ROCR_VISIBLE_DEVICES
或HIP_VISIBLE_DEVICES
,有关更多详细信息,请参见this或this。)>
例如:
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等效的功能。