限制MPI在单个GPU上运行,即使我们有单节点多GPU设置
我是分布式计算新手,我正在尝试运行一个使用MPI和ROCm(AMD框架在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
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有关。