Вы можете управлять активными графическими процессорами, устанавливая некоторые переменные среды (например, 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 не экспортировали все переменные окружения или могли перезагрузить ваш bashr c или cshr c. Поэтому использовать синтаксис 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, и CudaSetDevice (id) с C функцией, мне интересно, есть ли эквивалент для AMD или openCL).