Настройка GPUDirect для infiniband
Я пытаюсь настроить GPUDirect для использования вызовов rdma глаголов infiniband непосредственно в памяти устройства без необходимости использовать cudaMemcpy. У меня 2 машины с видеокартами nvidia k80 каждая с версией драйвера 367.27. CUDA8 установлен и Mellanox OFED 3.4 Также установлен плагин Mellanox-nvidia GPUDirect:
-bash-4.2$ service nv_peer_mem status
nv_peer_mem module is loaded.
Согласно этой теме " Как использовать GPUDirect RDMA с Infiniband" у меня есть все требования для GPUDirect, и следующий код должен успешно работать. Но это не так, и ibv_reg_mr завершается с ошибкой "Bad Address", как будто GPUDirect не установлен должным образом.
void * gpu_buffer;
struct ibv_mr *mr;
const int size = 64*1024;
cudaMalloc(&gpu_buffer,size); // TODO: Check errors
mr = ibv_reg_mr(pd,gpu_buffer,size,IBV_ACCESS_LOCAL_WRITE|IBV_ACCESS_REMOTE_WRITE|IBV_ACCESS_REMOTE_READ);
Запрашиваемая информация:
mlx5 используется.
Последний журнал ядра:
[Nov14 09:49] mlx5_warn:mlx5_0:mlx5_ib_reg_user_mr:1418:(pid 4430): umem get failed (-14)
Я что-то пропустил? Нужны ли мне какие-то другие пакеты или я должен как-то активировать GPUDirect в моем коде?
1 ответ
Распространенной причиной сбоя модуля nv_peer_mem является взаимодействие с Unified Memory (UVM). Не могли бы вы попробовать отключить UVM:
export CUDA_DISABLE_UNIFIED_MEMORY=1
?
Если это не решит вашу проблему, попробуйте запустить validation
а также copybw
тесты с https://github.com/NVIDIA/gdrcopy для проверки GPUDirectRDMA. Если это работает, то ваш стек Mellanox неправильно настроен.