Memcpy из памяти PCIe занимает больше времени, чем memcpy в память PCIe

Я пытаюсь выполнить чтение / запись данных на / с ПК с Linux с / на устройство PCIe 2.0 (2 линии). Память для чтения и записи находится в разных местах ОЗУ на устройстве PCIe. Эти воспоминания отображаются в Linux PC с помощью ioremap. Мой пример использования - достижение скорости чтения / записи 18 МБ / с, что, очевидно, поддерживается каналом PCIe. Память на устройстве PCIe не кэширована.

Я могу достичь пропускной способности записи, т.е. когда я записываю данные с локальной памяти ПК Linux в память устройства PCIe, используя memcpy. В этом случае memcpy занимает менее 1 мс для 9216 байтов данных. Но когда я читаю ioremapped PCIe-память в локальную память Linux, происходит потеря данных. Я профилировал memcpy, и это занимает более 1 мс, иногда 2 мс для 9216 байт данных. Я не хочу делать DMA для этой операции.

Есть мысли о том, в чем может быть проблема в этом случае? Как я могу справиться с этим?

0 ответов

Это вполне ожидаемо, и вы ничего не можете с этим поделать. ЦП может выполнять только сериализованные операции чтения и записи размером с слово, которые имеют очень низкую пропускную способность по каналу PCIe из-за накладных расходов протокола. Каждая операция связана с 24 или 28 байтами накладных расходов - это 12 или 16 байтов заголовка TLP плюс 12 байтов накладных расходов канального уровня, а ЦП может работать только с 4 или 8 байтами за раз... что в лучшем случае эффективность 25% (8/(8+24) = 25%) и в худшем случае эффективность 12,5% (4/(4+28) = 12,5%).

Однако накладные расходы протокола - не единственная проблема. Записи в PCIe отправляются, поэтому ЦП может просто выполнить кучу последовательных записей, которые в конечном итоге попадают на шину и на устройство. С другой стороны, при чтении ЦП может выполнить только одну операцию чтения, дождаться, пока он дважды пересечет шину, сохранить результат, выполнить другое чтение и т. Д. Поскольку он может работать только с 8 байтами за раз, производительность ужасна из-за относительно высокой задержки на шине PCIe (может составлять порядка микросекунд для каждой передачи).

Решение? Используйте DMA. PCIe специально разработан для поддержки эффективных операций DMA по шине, поскольку устройства могут выполнять гораздо большие операции чтения и записи, минимум до 128 байтов на операцию.

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