RDMA — эффективный способ обойти бесполезные копии данных между приложением и ядром ОС. Mmap — эффективный способ работы с большим файлом, как если бы это был просто массив байтов.
Я работаю с MPI через Infiniband, который поддерживает операции сети RDMA между процессами. Каждый процесс MPI имеет очень большой файл, чтобы поделиться с другими.
Может ли каждый процесс MPI создать область mmap для каждого большого файла и поделиться ею с другими? Я хочу разрешить каждому процессу читать любой файл любого процесса так, как будто он читает их память через RDMA (односторонняя связь MPI).
Насколько я знаю, когда приложение вызывает операцию RDMA, оно передает «адрес виртуальной памяти» непосредственно в NIC. NIC будет заниматься преобразованием адреса виртуальной памяти в адрес физической памяти. Если драйвер RDMA закрепит страницу с интересами до того, как отправит запрос в NIC, думаю, он будет работать. Есть ли у кого-нибудь опыт? : D
Спасибо
Да, вы можете зарегистрировать в RDMA область памяти, отображенную с помощью mmap()
, Смотрите документы для ibv_reg_mr
(http://www.rdmamojo.com/2012/09/07/ibv_reg_mr/) которые говорят:
Каждый адрес памяти в виртуальном пространстве вызывающего процесса может быть зарегистрирован, включая, но не ограничиваясь:
- Локальная память (переменная или массив)
- Глобальная память (переменная или массив)
- Динамически распределяемая память (используя malloc () или mmap ())
Других решений пока нет …