IOMMU очень полезен в том смысле, что он обеспечивает набор регистров картирования. Он может организовать, чтобы любая физическая память появлялась в диапазоне адресов, доступных устройством, и может привести к тому, что физически рассеянные буферы также выглядят смежными для устройств. Это не хорошо для сторонних карт PCI/PCI-Express или удаленных машин, пытающихся получить доступ к необработанному физическому смещению графического процессора NVIDIA, так как это может привести к не фактически Доступ к предполагаемым областям памяти или ингибирующим/ограничивающим такие доступ на сайте единицей IOMMU. Это должно быть отключено, потому что
"RDMA для GpuDirect в настоящее время полагается на Все физические адреса одинаковы с точки зрения устройств PCI."
Когда драйверы пытаются использовать MMU MMU и карты CPU и карты памяти, отображаемых ввода/вывода (MMIO) для использования в пространстве ядра, они обычно удерживают возвращенный адрес от отображения памяти для себя. Поскольку каждый драйвер работает в своем собственном контексте или пространстве имен, обмениваясь этими сопоставлениями между водителями (и) Nvidia и другими водителями сторонних поставщиков, которые хотят поддержать RDMA+Gpudirect будут очень сложными и приведут к конкретному поставщику решению (возможно, даже продукт. -Посказание, если водители сильно различаются между продуктами от сторонней стороны). Кроме того, сегодняшние операционные системы в настоящее время не имеют хорошего решения для обмена сопоставлениями MMIO между драйверами, поэтому NVIDIA экспортирует несколько функций, которые позволяют сторонним драйверам легко получить доступ к этой информации из космоса ядра, самого.
NVIDIA обеспечивает использование «физической адресации» для доступа к каждой карте через RDMA для GPUdirect. Это значительно упрощает процесс перемещения данных с одного компьютера в шину PCI-Express удаленной системы, используя схему физической адресации этой машины без необходимости беспокоиться о проблемах, связанных с виртуальной адресацией (например, разрешение виртуальных адресов для физических). Каждая карта имеет физический адрес, по которому он находится, и можно получить доступ в этом смещении; Только небольшой бит логики должен быть добавлен к стороннскому драйверу, пытающемуся выполнить операции RDMA. Кроме того, эти 32- или 64-битные базовые адреса являются частью стандартного пространства конфигурации PCI, поэтому физический адрес карты можно легко получить, просто прочитав из его панели, а не получает отображенный адрес, который получил драйвер NVIDIA. При прикреплении к карте. Универсальная виртуальная адресация NVIDIA (UVA) позаботится о вышеупомянутых физических адресах адреса для, казалось бы, сопряженной области памяти для пространство пользователя Приложения, как так:
Эти области памяти дополнительно разделены на три типа: процессор, графический процессор и бесплатный, которые все документированы здесь.
Вернемся к вашему случаю использования: так как вы находитесь пространство пользователя, У вас нет прямого доступа к физическому адресному пространству системы, а адреса, которые вы используете, вероятно, являются виртуальными адресами, предоставленными вам NVIDIA UVA. Предполагая, что предыдущие ассигнования не были сделаны, ваше распределение памяти должно находиться при Offset +0x00000000, что приведет к тому, что вы увидите одно и то же смещение GPU, самого. Если бы вы выделили второй буфер, я думаю, вы бы увидели этот буферный запуск сразу после конца первого буфера (на смещении +0x00100000 от базы виртуальный адрес графического процессора в вашем случае распределения 1 МБ).
Если бы вы были в пространство ядра, однако, и писали драйвер для карты вашей компании для использования RDMA для GPUdirect, вы будете использовать 32- или 64-битные физические адреса, назначенные GPU BIOS и/или ОС для RDMA непосредственно в Графический процессор, сам.
Кроме того, возможно, стоит отметить, что не все двигатели DMA фактически поддерживают виртуальные адреса для переводов - на самом деле, большинство требуют физических адресов, как обработка виртуальной адресации из двигателя DMA может стать сложным (стр. 7), таким образом, многим двигателям DMA не хватает поддержки для этого.
Чтобы ответить на вопрос из названия вашего поста, хотя: NVIDIA в настоящее время поддерживает физическую адресу только для RDMA+GPUDIRECT в пространстве ядра. Анкет За пространство пользователя Приложения, вы всегда будете использовать виртуальный адрес графического процессора, предоставленного вам NVIDIA UVA, который находится в виртуальном адресном пространстве процессора.
Относительно вашего приложения, вот упрощенная разбивка процесса, который вы можете сделать для операций RDMA:
- Ваш пространство пользователя Приложение Создает буферы, которые находятся в сфере объединенного виртуального адресного пространства NVIDIA (виртуальные адреса).
- Вызовать
cuPointerGetAttribute(...)
получить токены P2P; Эти токены относятся к памяти в контексте CUDA. - Отправить всю эту информацию пространство ядра Каким -то образом (например, ioctl, читать/записать в ваш драйвер и т. Д.). Как минимум, вам понадобятся эти три вещи, которые в конечном итоге в вашем пространство ядра Водитель:
- Токен (ы) P2P возвращается
cuPointerGetAttribute(...)
- Виртуальный адрес UVA (ES) буфера (ы)
- Размер буфера (ов)
- Токен (ы) P2P возвращается
- Теперь переведите эти виртуальные адреса на соответствующие физические адреса, вызывая функции пространства ядра Nvidia, поскольку эти адреса хранятся в таблицах страниц NVIDIA и могут быть доступны с экспортируемой функцией NVIDIA, например:
nvidia_p2p_get_pages(...)
,nvidia_p2p_put_pages(...)
, а такжеnvidia_p2p_free_page_table(...)
. - Используйте эти физические адреса, полученные на предыдущем шаге для инициализации вашего двигателя DMA, который будет манипулировать этими буферами.
Можно найти более подробное объяснение этого процесса здесь.