Как использовать GPUDirect RDMA с Infiniband

У меня есть две машины. На каждой машине есть несколько карт Тесла. На каждой машине также есть карта InfiniBand. Я хочу общаться между видеокартами на разных машинах через InfiniBand. Просто указать, чтобы указать одноадресной передачи было бы хорошо. Я, конечно, хочу использовать GPUDirect RDMA, чтобы избавить себя от лишних операций копирования.

Я знаю, что сейчас у Mellanox есть драйвер для карт InfiniBand. Но он не предлагает подробного руководства по разработке. Также я знаю, что OpenMPI поддерживает функцию, о которой я спрашиваю. Но OpenMPI слишком тяжел для этой простой задачи и не поддерживает несколько графических процессоров в одном процессе.

Интересно, смогу ли я получить какую-либо помощь по прямому использованию драйвера для связи. Пример кода, учебник, все было бы хорошо. Кроме того, я был бы признателен, если бы кто-нибудь мог помочь мне найти код, касающийся этого, в OpenMPI.

1 ответ

Решение

Для работы GPUDirect RDMA вам необходимо установить следующее:

Все вышеперечисленное должно быть установлено (в порядке, указанном выше), и загружены соответствующие модули. После этого вы сможете зарегистрировать память, выделенную в видеопамяти графического процессора для транзакций RDMA. Пример кода будет выглядеть так:

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);

Это создаст (в системе с поддержкой GPUDirect RDMA) область памяти с допустимым ключом памяти, который вы можете использовать для транзакций RDMA с нашим HCA.

Для получения более подробной информации об использовании глаголов RDMA и InfiniBand в вашем коде, вы можете обратиться к этому документу.

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