Задержка в ioread

Предположим, у вас есть устройство PCIE, представляющее один BAR и одну область DMA, объявленные с помощью pci_alloc_consistent(..). Флаги BAR указывают на область памяти без предварительной выборки, без кэширования.

Каковы основные причины задержки при чтении области DMA и, аналогично, каковы причины задержки при чтении BAR?

Спасибо за ответ на этот простой вопрос:D!

1 ответ

Это пахнет как домашняя работа, но я подозреваю, что многие не очень хорошо понимают эту концепцию, поэтому я добавлю ответ.

Лучший способ обдумать это - подумать о том, что должно произойти, чтобы завершить чтение. Процессор и устройство находятся на разных сторонах канала PCIe. Полезно рассматривать PCI-Express как мини-сеть. Каждая ссылка является двухточечной (например, ваш компьютер подключен к другому компьютеру). Также могут быть промежуточные коммутаторы (иначе мосты в PCI). В этом случае ваш компьютер подключен к коммутатору, который, в свою очередь, подключен к другому компьютеру.

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

Но если ЦП хочет прочитать из BAR в устройстве, ЦП (фактически корневой комплекс PCIe, интегрированный с ЦП) должен составить запрос чтения PCIe, отправить запрос и подождать, пока устройство декодирует запрос, получит доступ к BAR. местоположение и отправляет обратно запрошенные данные. ТИК Так. Ваш процессор больше ничего не делает, пока ожидает завершения.

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

Если устройство хочет получить доступ к памяти, находящейся "в" процессоре, это почти то же самое в обратном направлении. ("Прямой доступ к памяти" просто означает, что ему не нужно прерывать процессор для его обработки, но что-то [корневой комплекс здесь] все еще отвечает за декодирование запроса, выполнение чтения и отправку обратно полученных данных.)

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

Конечно, PCIe очень быстрый, поэтому все это происходит за считанные наносекунды, но это все же на несколько порядков медленнее, чем "локальное" чтение.

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