Передача GPUDirect RDMA с графического процессора на удаленный хост

Сценарий:

У меня есть две машины, клиент и сервер, подключенные к Infiniband. Серверная машина имеет графический процессор NVIDIA Fermi, а клиентская машина не имеет графического процессора. У меня есть приложение, работающее на машине с графическим процессором, которое использует графический процессор для некоторых вычислений. Данные результата на графическом процессоре никогда не используются серверной машиной, а вместо этого отправляются непосредственно на клиентскую машину без какой-либо обработки. Прямо сейчас я делаю cudaMemcpy, чтобы получить данные из графического процессора в системную память сервера, а затем отправить их клиенту через сокет. Я использую SDP для включения RDMA для этого сообщения.

Вопрос:

Могу ли я воспользоваться преимуществами технологии NVIDIA GPUDirect, чтобы избавиться от вызова cudaMemcpy в этой ситуации? Я считаю, что у меня правильно установлены драйверы GPUDirect, но я не знаю, как инициировать передачу данных без предварительного копирования их на хост.

Я предполагаю, что невозможно использовать SDP в сочетании с GPUDirect, но есть ли другой способ инициировать передачу данных RDMA с графического процессора серверной машины на клиентскую машину?

Бонус: если у кого-то есть простой способ проверить правильность установки зависимостей GPUDirect, это тоже будет полезно!


person DaoWen    schedule 14.08.2012    source источник
comment
В SDK примеров кода CUDA вы можете найти пример кода, который демонстрирует, что вы хотите — developer.nvidia.com/cuda/cuda-cc-sdk-code-samples. Вам нужно будет использовать cudaMemcpyAsync для асинхронного копирования на хост GPU.   -  person Sayan    schedule 15.08.2012
comment
У меня есть CUDA SDK, но я не вижу примеров использования технологии GPUDirect. Знаете ли вы конкретный образец программы, на который я должен обратить внимание?   -  person DaoWen    schedule 16.08.2012
comment
В настоящее время я не загрузил его, но я думаю, что пример простой одноранговой передачи с несколькими графическими процессорами в ссылке, которую я дал, - это то, что вам нужно.   -  person Sayan    schedule 16.08.2012
comment
Я посмотрю на это и отпишусь, если ошибаюсь, но я не ищу передачи GPU-to-GPU (P2P). Я почти уверен, что смогу сделать это с помощью обычного вызова cudaMemcpy. То, что я ищу, - это способ прямой передачи из графического процессора в память на другом хосте с использованием RDMA и Infiniband.   -  person DaoWen    schedule 17.08.2012
comment
Хорошо, в этом случае вам определенно нужно использовать закрепленную память (malloc через cudaMallocHost) или использовать функцию cudaHostRegister. Я предполагаю, что вам просто нужно закрепить память, и GPUDirect включит передачу RDMA, если настройка в порядке (если ваша пропускная способность после этого немного лучше, чем текущая, тогда вы можете быть уверены в улучшении). И насколько я знаю, GPUDirect ускорил бы только cudaMemCpy, и что его нельзя убрать, если у вас много функций memcpy (H2D,D2H), то можно было бы просто использовать cudaMemcpyDefault.   -  person Sayan    schedule 17.08.2012
comment
Спасибо! Я рассмотрю возможность использования cudaHostRegister для настройки клиента в качестве удаленного хоста, а затем вызову cudaMemcpy для прямой передачи данных с графического процессора на клиент.   -  person DaoWen    schedule 17.08.2012


Ответы (1)


GPUDirect RDMA — это новая функция, которая будет реализована в сотрудничестве с партнерами NVIDIA по infiniband. Он был анонсирован вместе с CUDA 5.0, но пока недоступен. Следите за обновлениями на странице GPUDirect.

person harrism    schedule 31.08.2012
comment
Я видел эту функцию, но похоже, что она нацелена на P2P-передачи GPU. Позволит ли мне также копировать данные напрямую на удаленный узел, не задействуя ЦП на исходном узле? - person DaoWen; 31.08.2012
comment
Да, именно это и означает RDMA — удаленный прямой доступ к памяти. - person harrism; 03.09.2012
comment
Чтобы процитировать страницу, на которую вы ссылаетесь: Устраните узкие места в пропускной способности ЦП и задержке, используя прямой доступ к памяти (DMA) между графическими процессорами и другими устройствами PCIe ... Это оставляет меня неясным относительно того, является ли драйвер CUDA имеет поддержку RDMA для ситуации, описанной выше, или только для передачи P2P. Кажется, что это будет легко поддерживаться, но эта страница не кажется очень подробной по этому вопросу. Это все еще кажется хорошим ответом, поэтому я приму его. - person DaoWen; 03.09.2012
comment
Ключевое слово здесь — удаленный, т. е. не пиры на одной шине PCI-e. Для этого потребуется поддержка конкретных производителей карт Infiniband, с которыми сотрудничает NVIDIA. - person harrism; 03.09.2012
comment
@harrism Но можем ли мы получить доступ к одноранговой сети через Infiniband-RDMA, то есть можем ли GPU1-Core получить доступ по указателю в ядре‹‹‹››› к GPU2-RAM? GPU1-Core ‹-Infiniband-›GPU2-RAM - person Alex; 19.11.2013
comment
@ Алекс, нет, GPU1 ПК1 не может получить доступ к ОЗУ (GPU2-RAM) удаленного ПК2 с обычными операциями чтения памяти. RDMA означает, что ПК1 может публиковать запросы с infiniband для копирования некоторого объема памяти с ПК2 (или ОЗУ GPU2) в некоторую локальную память (ОЗУ ПК1 или ОЗУ ГП1) без прерывания удаленного ПК2 или memcpy. Запрос явно публикуется в QP: mellanox.com/related-docs/prod_software/ стр. 106 5.2.7 rdma_post_read... Содержимое удаленной области памяти будет прочитано в локальный буфер данных. Вы можете получить доступ к локальной копии данных только после завершения этого запроса. - person osgx; 26.05.2017