Всегда использует ли Gpudirect Nvidia RDMA только физические адреса (в физическом адресном пространстве процессора)?

StackOverflow https://stackoverflow.com/questions/19841815

Вопрос

Как мы знаем: http://en.wikipedia.org/wiki/iommu#advantages

Перегулка периферической памяти может быть подтверждена Iommu. Анкет Периферийное устройство, использующее расширение запроса интерфейса INDERCHEREST INTERSION PCI-SIG PCIE (ATS).

enter image description here

Но когда мы используем GPU NVIDIA с CUDA> = 5.0, мы можем использовать RDMA GPUdirect и знать, что:

http://docs.nvidia.com/cuda/gpudirect-rdma/index.html#how-gpudirect-rdma-works

Традиционно ресурсы, такие как стержня, отображаются с адресом пользователя или адресного пространства ядра с использованием MMU ЦП в качестве адресов ввода -вывода (MMIO), отображаемых памятью (MMIO). Однако, потому что Текущие операционные системы не имеют достаточных механизмов для обмена регионами MMIO между драйверами, Функции экспорта драйвера NVIDIA ядра для выполнения необходимых переводов адресов и отображений.

http://docs.nvidia.com/cuda/gpudirect-rdma/index.html#supported-systems

RDMA для GPUdirect в настоящее время опирается на все физические адресабыть одинаковым с точки зрения устройств PCI. Это делает его несовместимым с iOmmus, и, следовательно, они должны быть отключены для RDMA для работы Gpudirect.

И если мы распределяем и отображаем ЦП-Рэм в UVA, как здесь:

#include <iostream>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

int main() {
    // Can Host map memory
    cudaSetDeviceFlags(cudaDeviceMapHost);  

    // Allocate memory
    unsigned char *host_src_ptr = NULL;
    cudaHostAlloc(&host_src_ptr, 1024*1024, cudaHostAllocMapped);
    std::cout << "host_src_ptr = " << (size_t)host_src_ptr << std::endl;

    // Get UVA-pointer
    unsigned int *uva_src_ptr = NULL;
    cudaHostGetDevicePointer(&uva_src_ptr, host_src_ptr, 0);
    std::cout << "uva_src_ptr  = " << (size_t)uva_src_ptr << std::endl;

    int b;  std::cin >> b;
    return 0;
}

Мы получаем равные указатели в Windwos7x64, это означает, что cudaHostGetDevicePointer() ничего не делать:

host_src_ptr = 68719476736

UVA_SRC_PTR = 68719476736

Что означает «достаточные механизмы для обмена регионами MMIO между драйверами», что означает механизм, и почему я не могу использовать iOmmu, используя виртуальный адрес для доступа через PCIe в физическую область стержня - другое устройство с отображением памяти через PCIe ?

И означает ли это, что RDMA Gpudirect всегда управляет только физическими адресами (в физическом адресном пространстве процессора), но почему мы отправляем в функцию ядра uva_src_ptr который равен host_src_ptr - Простой указатель в виртуальном адресном пространстве процессора?

Это было полезно?

Решение

IOMMU очень полезен в том смысле, что он обеспечивает набор регистров картирования. Он может организовать, чтобы любая физическая память появлялась в диапазоне адресов, доступных устройством, и может привести к тому, что физически рассеянные буферы также выглядят смежными для устройств. Это не хорошо для сторонних карт PCI/PCI-Express или удаленных машин, пытающихся получить доступ к необработанному физическому смещению графического процессора NVIDIA, так как это может привести к не фактически Доступ к предполагаемым областям памяти или ингибирующим/ограничивающим такие доступ на сайте единицей IOMMU. Это должно быть отключено, потому что

"RDMA для GpuDirect в настоящее время полагается на Все физические адреса одинаковы с точки зрения устройств PCI."

-nvidia, Соображения дизайна для RDMA и GPUDIRECT

Когда драйверы пытаются использовать MMU MMU и карты CPU и карты памяти, отображаемых ввода/вывода (MMIO) для использования в пространстве ядра, они обычно удерживают возвращенный адрес от отображения памяти для себя. Поскольку каждый драйвер работает в своем собственном контексте или пространстве имен, обмениваясь этими сопоставлениями между водителями (и) Nvidia и другими водителями сторонних поставщиков, которые хотят поддержать RDMA+Gpudirect будут очень сложными и приведут к конкретному поставщику решению (возможно, даже продукт. -Посказание, если водители сильно различаются между продуктами от сторонней стороны). Кроме того, сегодняшние операционные системы в настоящее время не имеют хорошего решения для обмена сопоставлениями MMIO между драйверами, поэтому NVIDIA экспортирует несколько функций, которые позволяют сторонним драйверам легко получить доступ к этой информации из космоса ядра, самого.

NVIDIA обеспечивает использование «физической адресации» для доступа к каждой карте через RDMA для GPUdirect. Это значительно упрощает процесс перемещения данных с одного компьютера в шину PCI-Express удаленной системы, используя схему физической адресации этой машины без необходимости беспокоиться о проблемах, связанных с виртуальной адресацией (например, разрешение виртуальных адресов для физических). Каждая карта имеет физический адрес, по которому он находится, и можно получить доступ в этом смещении; Только небольшой бит логики должен быть добавлен к стороннскому драйверу, пытающемуся выполнить операции RDMA. Кроме того, эти 32- или 64-битные базовые адреса являются частью стандартного пространства конфигурации PCI, поэтому физический адрес карты можно легко получить, просто прочитав из его панели, а не получает отображенный адрес, который получил драйвер NVIDIA. При прикреплении к карте. Универсальная виртуальная адресация NVIDIA (UVA) позаботится о вышеупомянутых физических адресах адреса для, казалось бы, сопряженной области памяти для пространство пользователя Приложения, как так:

CUDA Virtual Address Space

Эти области памяти дополнительно разделены на три типа: процессор, графический процессор и бесплатный, которые все документированы здесь.

Вернемся к вашему случаю использования: так как вы находитесь пространство пользователя, У вас нет прямого доступа к физическому адресному пространству системы, а адреса, которые вы используете, вероятно, являются виртуальными адресами, предоставленными вам NVIDIA UVA. Предполагая, что предыдущие ассигнования не были сделаны, ваше распределение памяти должно находиться при Offset +0x00000000, что приведет к тому, что вы увидите одно и то же смещение GPU, самого. Если бы вы выделили второй буфер, я думаю, вы бы увидели этот буферный запуск сразу после конца первого буфера (на смещении +0x00100000 от базы виртуальный адрес графического процессора в вашем случае распределения 1 МБ).

Если бы вы были в пространство ядра, однако, и писали драйвер для карты вашей компании для использования RDMA для GPUdirect, вы будете использовать 32- или 64-битные физические адреса, назначенные GPU BIOS и/или ОС для RDMA непосредственно в Графический процессор, сам.

Кроме того, возможно, стоит отметить, что не все двигатели DMA фактически поддерживают виртуальные адреса для переводов - на самом деле, большинство требуют физических адресов, как обработка виртуальной адресации из двигателя DMA может стать сложным (стр. 7), таким образом, многим двигателям DMA не хватает поддержки для этого.

Чтобы ответить на вопрос из названия вашего поста, хотя: NVIDIA в настоящее время поддерживает физическую адресу только для RDMA+GPUDIRECT в пространстве ядра. Анкет За пространство пользователя Приложения, вы всегда будете использовать виртуальный адрес графического процессора, предоставленного вам NVIDIA UVA, который находится в виртуальном адресном пространстве процессора.


Относительно вашего приложения, вот упрощенная разбивка процесса, который вы можете сделать для операций RDMA:

  1. Ваш пространство пользователя Приложение Создает буферы, которые находятся в сфере объединенного виртуального адресного пространства NVIDIA (виртуальные адреса).
  2. Вызовать cuPointerGetAttribute(...) получить токены P2P; Эти токены относятся к памяти в контексте CUDA.
  3. Отправить всю эту информацию пространство ядра Каким -то образом (например, ioctl, читать/записать в ваш драйвер и т. Д.). Как минимум, вам понадобятся эти три вещи, которые в конечном итоге в вашем пространство ядра Водитель:
    • Токен (ы) P2P возвращается cuPointerGetAttribute(...)
    • Виртуальный адрес UVA (ES) буфера (ы)
    • Размер буфера (ов)
  4. Теперь переведите эти виртуальные адреса на соответствующие физические адреса, вызывая функции пространства ядра Nvidia, поскольку эти адреса хранятся в таблицах страниц NVIDIA и могут быть доступны с экспортируемой функцией NVIDIA, например: nvidia_p2p_get_pages(...), nvidia_p2p_put_pages(...), а также nvidia_p2p_free_page_table(...).
  5. Используйте эти физические адреса, полученные на предыдущем шаге для инициализации вашего двигателя DMA, который будет манипулировать этими буферами.

Можно найти более подробное объяснение этого процесса здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top