Перейти к содержанию
    

MpSoc + DDR4 скорость чтения

Здравствуйте. Проект разрастается и появляются новые вопросы.

Для отладки VCU добавил в PL модуль генерирующий тестовую картинку 4:2:2 FullHD. В модуле реализован DMA канал и генерация прерывания после записи кадра и пара регистров для управления передачей

В драйвере выделяю память для DMA через dma_alloc_coherent, шинный адрес записываю в соответствующий регистр модуля. Здесь все стандартно. DMA работает хорошо, все копируется правильно, с прерыванием проблем тоже нет.

В юзерспейс принятые данные копируются через copy_to_user.

Проблема со скорость чтения этих данных из модуля. По моим замерам выходит, что буфер размером 2*1920*1080 копируется ~ 30 мсек.

Память DDR4 работает на частоте 1200 МГц, шина 64 бит. У меня же получается  едва ли 100 МБ/сек, что на пару порядков меньше ожидаемого.

Может кто-нибудь сталкивался с этим ? Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно. Сейчас выделил 2 буфера в юзерспейсе, копирую через memcpy  и получаю скорость в 40 раз быстрее, хотя буфера находятся в той же самой DDR. Что за чудеса ? И не связано ли это с кэшированием ? А если связано, то, где нужно копать ? Настройки ядра ? Модуль ядра ? DTB ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, карамболь said:

В юзерспейс принятые данные копируются через copy_to_user.

Ой! А mmap - не судьба?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, gosha-z said:

Ой! А mmap - не судьба?

Признаюсь честно, с mmap работал только в юзерспейсе, опыта разработки модулей ядра с поддержкой mmap отсутствует. Я вообще с Линуксом недавно столкнулся, раньше работал с ПЛИС и процессорами без ОС. Если не сложно, поделитесь ссылками для быстрого старта с mmap

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, карамболь said:

Если не сложно, поделитесь ссылками для быстрого старта с mmap

Тыц

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, gosha-z said:

Спасибо. И еще, для общего развития. У вас есть идеи, почему такая дикая разница в скорости передачи между буферами в юзерспейсе и между юзерспейсом и буфером, выделенном в модуле ядра ?  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 minutes ago, карамболь said:

У вас есть идеи, почему такая дикая разница в скорости передачи между буферами в юзерспейсе и между юзерспейсом и буфером, выделенном в модуле ядра ? 

Потому-что во втором случае каждый раз происходит дрессировка MMU, а это небыстрый процесс..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 minutes ago, gosha-z said:

Потому-что во втором случае каждый раз происходит дрессировка MMU, а это небыстрый процесс..

А вылечить это можно ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, gosha-z said:

Только переходом на mmap

Я вас понял. Огромное спасибо !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Реализовал в драйвере системный вызов mmap через dma_mmap_coherent. В юзерспейсе вызываю mmap и получаю адрес буфера. Копирую из полученного адреса во временный буфер. Данные копируются правильно. Но время копирования те же 30 мсек.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, gosha-z said:

Зачем?

Для оценки времени копирования. Я потом этот буфер должен передать в функцию, которую пишут другие люди, а они там делают резервные копии под свои нужды. Одновременно, этот буфер необходимо записать во входной буфер кодера

Изменено пользователем карамболь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дополню. На выходных читал форумы по этой проблеме, оказалось, что я не первый с этим столкнулся.

Короче, добавив эту строку "dma-coherent" в DTB удалось сократить время чтения ~ в 10 раз.

Здесь https://github.com/bperez77/xilinx_axidma/issues/69 обсуждается эта проблема и рекомендуют еще и в дизайне добавить пару констант на Axi шину, но я этого не делал.

Скорость чтения на данный момент меня вполне устраивает. Интересно, чем придется за это заплатить ? Пока, вроде, данные приходят корректные

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему бы не реализовать таймер на логике, который счтал бы такты при передаче данных, а потом просто значение считать?

PS просто на логике будет более достоверный результат

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...