Jump to content
    

Bus Master DMA для PCIe

Приветствую.

Собрал систему (см. рисунок) для передачи данных по PCIe.

Ядро AXI Bridge for PCIe сконфигурировано в режиме x4, 64 bit, 250MHz, должно позволить прокачивать поток 16 Гбит/с.

В качестве DMA используется ядро AXI DMA v7.1 в режиме Scatter-Gather. Кольцо дескрипторов и буферы данных выделяются в памяти ядра Linux. Ранее было сделано так, пропускная способность канала составляла ~6 Гбит/с.

Тут опять упёрся в 6 Гбит/с, думал, что софт ограничивает производительность канала. Потом убрал вмешательство системы в работу DMA - инициализирую кольцо дескрипторов, запускаю DMA. DMA бросает данные пока не закончатся дескрипторы. Оценивая время обработки кольца дескрипторов и переданный объём данных, получаю чуть больше 6 Гбит/с.

Вытянул сигналы AXI4-Stream между FIFO и DMA на ILA, вижу - FIFO держит TVALID всегда в 1, а DMA периодически (очень часто) сбрасывает TREADY в 0. Получается DMA является виновником ограничения скорости потока. В доке вычитал, что в тестах получали пропускную способность до ~70%, но это ~11,2 Гбит/с, меня бы устроило.

Вопрос - как поднять производительность DMA? Как понимаю, AXI Interconnect и PCIe мост могут тормозить DMA?

post-63539-1444330218_thumb.jpg

Share this post


Link to post
Share on other sites

Кольцо дескрипторов ... выделяется в памяти ядра Linux.

 

Может в этом причина ? Посмотрите анализатором очередность транзакций на шине axi.

Share this post


Link to post
Share on other sites

Может в этом причина ? Посмотрите анализатором очередность транзакций на шине axi.

Тогда тормоза были бы только во время чтения очередного дескриптора (по завершению передачи пакета), а так DMA сбрасывает (часто) TREADY на AXI4-Stream в 0 во время передачи данных одного пакета (за дескриптором ему пока лезть не надо). Пакеты сделал максимального размера, который поддерживает генератор трафика (65536 слов * 64 бита).

Шину буду ковырять, но пока не успел.

 

Share this post


Link to post
Share on other sites

На сколько тактов сбрасывает ? Какими пачками идет вычитывание по axi ?

Посмотрите на готовность к передаче ядра pcie.

Share this post


Link to post
Share on other sites

А что дальше, между dma и pcie ?

Я к тому, что ядро pcie дробит пакеты по max payload size и затык может быть там, в не готовности ядра pcie принимать новые данные от dma.

Share this post


Link to post
Share on other sites

На AXI4 между DMA и AXI Interconnect вот такая штука (тут даже не пойму на какой из сигналов настроить триггер):

 

PS:

Триггер настроен на TLAST для AXI4-Stream (FIFO->DMA).

 

PSPS:

Тут, как понимаю, Slave (AXI Interconnect) выставил WREADY, а Master (DMA) ещё очень долго тупит. Получается, что все проблемы из-за DMA?

Или надо ещё смотреть и на BVALID?

post-63539-1444394933_thumb.png

post-63539-1444394938_thumb.png

post-63539-1444395674_thumb.png

Share this post


Link to post
Share on other sites

Засинхронизировал триггер по начальному адресу буфера (0х0000_0004_0720_0000) на который ссылается первый дескриптор в кольце. На рисунке сечение DMA-AXI Interconnect, для AXI Interconnect-PCIe Bridge диаграмма такая же.

Нужна помощь в анализе, что тут работает неправильно (медленно) и получится ли ускорить?

Если всё правильно понимаю, то WVALID ждёт подтверждения записи BVALID для второго burst-a и только потом устанавливается в 1. Как-то можно повлиять на более быстрое появления BVALID и, как следствие, на WVALID?

post-63539-1444473281_thumb.png

post-63539-1444473287_thumb.png

Share this post


Link to post
Share on other sites

Увеличил burst size для DMA до максимального 256, а вместе с этим увеличилось время от WLAST до BVALID. Что за ерунда?

Где тут увеличение производительности?

Время от WLAST до BVALID должно было остаться таким же, как и при значении burst 16??? Если нет, за счёт чего тут можно было получить увеличение производительности DMA???

Спасибо.

post-63539-1444486398_thumb.png

Share this post


Link to post
Share on other sites

Можете в pcie-mm ядре встать анализатором на pipe интерфейс (tx и rx) ?

По pcie у вас только в теории пойдут пакеты 4кб, но в реальности они будут по 128, ну может 256 байт.

А на пакет (группу пакетов) необходимо дождаться ack от хоста и только потом разрешать перезаписывать буфер.

Share this post


Link to post
Share on other sites

Можете в pcie-mm ядре встать анализатором на pipe интерфейс (tx и rx) ?

По pcie у вас только в теории пойдут пакеты 4кб, но в реальности они будут по 128, ну может 256 байт.

А на пакет (группу пакетов) необходимо дождаться ack от хоста и только потом разрешать перезаписывать буфер.

Т.е. я не смогу раскачать DMA более полученных 6 Гбит/с? Нужно ставить Gen3 (сейчас стоит настройка для Gen 2) увеличивать размер шины данных до 128/256 бит? Только тогда можно будет превысить потолок в 6 Гбит/с?

 

 

Или, как вариант, выбрасывать DMA и мост и делать что-то своё для работы с голым ядром PCIe Gen3?

Share this post


Link to post
Share on other sites

Мне кажется pcie-mm всегда позиционировалось как удобное решение для микропроцессорной системы, не более того, при этом максимальной скорости он него никто и не требовал.

В чем точно происходит затык в вашем случае было бы интересно выяснить.

Однако для получения максимальных скоростей очень вероятно придется самому с нуля писать dma для голого ядра pcie.

Или посмотреть на работу dsmv.

Или купить решение от plda/nwlogic.

Или дождаться что же xilinx предложит как альтернативу (xdma). Стоимость может оказаться невысокой или вообще бесплатной.

Им нужно будет двигать свое решения для OpenCL, а для этого нужна цепь pcie-dma-mig(ddr). И xdma как раз призвано заполнить пробел.

Share this post


Link to post
Share on other sites

Мне кажется pcie-mm всегда позиционировалось как удобное решение для микропроцессорной системы, не более того, при этом максимальной скорости он него никто и не требовал.

А я думал это ядро и есть самое то, что Xilinx предлагает для работы с PCIe, а оно вот как оказывается :(

 

Однако для получения максимальных скоростей очень вероятно придется самому с нуля писать dma для голого ядра pcie.

Или посмотреть на работу dsmv.

Вот с нуля делать и не хотелось. Разбираться с DS_DMA показалось очень сложным, решил на готовых ядрах собрать систему, счас надо думать, куда двигать дальше.

 

Или дождаться что же xilinx предложит как альтернативу (xdma). Стоимость может оказаться невысокой или вообще бесплатной.

Почти дождался - вчера слил, установил, посмотрел. Остался вопрос с мануалом на это чудо-ядро XDMA. Мне его давать не хотят, так что если кто помог бы с описанием ядра, был бы очень благодарен.

 

 

В чем точно происходит затык в вашем случае было бы интересно выяснить.

А может ли как-то система (драйвер) влиять на такую длительность появления BVALID? В ядре есть много способов выделения памяти, может я использую неправильный (пользуюсь kmalloc)?

Мне пока нужно выжать с системы 10 Гбит/с. Можно наверное настроить мост на работу с PCIe Gen 3, пропускная способность должна будет возрасти. Тут только придётся подбирать более навороченную систему для работы с платой, мой рабочий ПК подойдёт, а вот тот, что будем использовать в проекте???

Share this post


Link to post
Share on other sites

Приветствую!

 

Для начала неплохо бы убедится что PCIe действительно работает в x4 Gen2, каков размер payload.

 

А правильнее было бы на модели в симуляторе посмотреть что и как работает, какова скорость передачи и что и как тормозит передачу. И уж если на модели скорость будет ОК то только тогда разбирается на рабочей системе сравнивая с моделью что не так.

 

 

Успехов! Rob.

 

 

 

 

 

 

Share this post


Link to post
Share on other sites

Для начала неплохо бы убедится что PCIe действительно работает в x4 Gen2, каков размер payload.

Настройки для моста стоят именно такие (см. рисунок). По поводу payload не понял, что это, такой опции там нет. Есть ещё вкладка (второй рисунок) с опциями для моста (можно выбирать 2/4/8), но с ней не разбирался, надо глянуть, за что оно отвечает.

 

А правильнее было бы на модели в симуляторе посмотреть что и как работает, какова скорость передачи и что и как тормозит передачу. И уж если на модели скорость будет ОК то только тогда разбирается на рабочей системе сравнивая с моделью что не так.

Не совсем представляю, как это всё проверять в симуляторе. Завтра думаю проверить как быстро DMA будет бросать данные в память FPGA, но тут наверное всё будет работать быстрее.

post-63539-1444594938_thumb.jpg

post-63539-1444594944_thumb.jpg

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...