限制MPI在单个GPU上运行,即使我们有单节点多GPU设置

限制MPI在单个GPU上运行,即使我们有单节点多GPU设置,mpi,distributed-computing,gpgpu,hpc,amd-rocm,Mpi,Distributed Computing,Gpgpu,Hpc,Amd Rocm,我是分布式计算新手,我正在尝试运行一个使用MPI和ROCm(AMD框架在GPU上运行)的程序 我用来运行程序的命令是 mpirun-np 4./a.out 但默认情况下,它在我的机器中可用的2个GPU上运行。 有没有办法让它只在单个GPU上运行?如果有,怎么做 提前感谢:)您可以通过设置一些环境变量来控制活动的GPU (例如,GPU设备顺序,ROCR\U可视设备或HIP\U可视设备,请参阅或了解更多详细信息) 例如: export HIP_VISIBLE_DEVICES=0 mpirun -np

我是分布式计算新手,我正在尝试运行一个使用MPI和ROCm(AMD框架在GPU上运行)的程序

我用来运行程序的命令是
mpirun-np 4./a.out

但默认情况下,它在我的机器中可用的2个GPU上运行。 有没有办法让它只在单个GPU上运行?如果有,怎么做


提前感谢:)

您可以通过设置一些环境变量来控制活动的GPU (例如,
GPU设备顺序
ROCR\U可视设备
HIP\U可视设备
,请参阅或了解更多详细信息)

例如:

export HIP_VISIBLE_DEVICES=0
mpirun -np 4 ./a.out
# or 
HIP_VISIBLE_DEVICES=0 mpirun -np 4 ./a.out
请注意,某些MPI实现不会导出所有环境变量,或者可能会重新加载bashrc或cshrc。因此,使用MPI的语法设置EnvVar更安全:

# 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;
#包括
// ...
char*hip_visible_devices=getenv(“hip_visible_devices”);

如果(hip_visible_devices)std::cout您可以通过设置一些环境变量来控制活动的GPU (例如,
GPU设备顺序
ROCR\U可视设备
HIP\U可视设备
,请参阅或了解更多详细信息)

例如:

export HIP_VISIBLE_DEVICES=0
mpirun -np 4 ./a.out
# or 
HIP_VISIBLE_DEVICES=0 mpirun -np 4 ./a.out
请注意,某些MPI实现不会导出所有环境变量,或者可能会重新加载bashrc或cshrc。因此,使用MPI的语法设置EnvVar更安全:

# 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;
#包括
// ...
char*hip_visible_devices=getenv(“hip_visible_devices”);

如果(hip_visible_devices)std::您是否尝试过这些想法和envvar:?例如ROCR_VISIBLE_DevicesThank@Demi Lune,HIP_VISIBLE_DEVICES为我工作。但是,MPI可以控制使用哪个GPU吗?您可以通过
-x
将环境变量传递给mpirun:
mpirun-np 2-x HIP_VISIBLE_DEVICES=1,2./a.out
但是您可能正在寻找一种方法来为某些进程列组设置GPU#0#为其他列组设置GPU#?你可以尝试
setenv(“HIP\u可见设备”,排名%2)在mpi程序中,就在mpi_init之后?您是否尝试过这些想法和envvar:?例如ROCR_VISIBLE_DevicesThank@Demi Lune,HIP_VISIBLE_DEVICES为我工作。但是,MPI可以控制使用哪个GPU吗?您可以通过
-x
将环境变量传递给mpirun:
mpirun-np 2-x HIP_VISIBLE_DEVICES=1,2./a.out
但是您可能正在寻找一种方法来为某些进程列组设置GPU#0#为其他列组设置GPU#?你可以尝试
setenv(“HIP\u可见设备”,排名%2)在您的mpi程序中,就在mpi_init之后?感谢@Demi LuneFor AMD的详细解释,CudaSetDevice()有一个等价物,但我不确定是否与OpenCL有关。感谢@Demi LuneFor AMD的详细解释,CudaSetDevice()有一个等价物,但我不确定是否与OpenCL有关。