Ограничьте MPI для работы на одном графическом процессоре, даже если у нас есть настройка одного узла и нескольких графических процессоров

Я новичок в распределенных вычислениях, и я пытаюсь запустить программу, которая использует MPI и ROCm(фреймворк AMD для работы на GPU).

Я использую команду для запуска программы: mpirun -np 4 ./a.out

Но по умолчанию он работает на 2 доступных графических процессорах моей машины. Есть ли способ заставить его работать только на одном графическом процессоре, и если да, то как?

Заранее спасибо:)

1 ответ

Решение

Вы можете управлять активными графическими процессорами, задав некоторые переменные среды (например, 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).

Другие вопросы по тегам