реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ALTERA PCIe 4х Chaining DMA, Не могу разобраться как работает
soldat_shveyk
сообщение Oct 22 2012, 13:03
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 3-07-07
Из: С-Петербург
Пользователь №: 28 859



Доброго дня!

Есть плата Arria II GX Kit, скачал на него reference design на PCIe 4x.
После долгих танцев с бубном удалось установить их Jungo board driver и запустить тест скорости DMA Write.
Теперь хочу их reference design изменить под свою задачу - запускать DMA Write по мере наполнения FIFO, в которую поступают 64-разрядные отсчеты данных.
Читаю альтеровские доки и не могу разобраться - как у них работает это самое chaining DMA?
Куда заносить физический адрес памяти, по которому отправлять данные?
Где указывать - сколько данных передавать по DMA Write?
Как запустить передачу?
Непонятен сам принцип работы chaining dma. дескрипторы какие-то. где из брать?
Лет пять назад делал PCIe 8x на старом Stratix II GX.
Там было все просто - взял пример simple dma, подключил вместо тестового счетчика свой источник данных, выделил память в драйвере и передал физический адрес в плату, указал количество передаваемых данных -
и все замечательно работало, и работает до сих пор.
А тут решили перейти на Arria II GX, а ref design только для chaining dma. И ничего общего с тем, что было раньше на Stratix.

Если кто уже разбирался с этим - помогите, пожалуйста.






Go to the top of the page
 
+Quote Post
Shivers
сообщение Oct 23 2012, 05:52
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950



Я с этой коркой не работал. Но дескрипторые DMA существуют уже лет 10: это очень мощная штука, позволяющая существенно разгрузить процессор. Сравнивая с обычным DMA по принципу фифо+2счетчика, разница получается как земля и небо. Но и программирвоать такое ДМА существенно сложнее.
Внимательно читайте именно альтеровские доки; т.к. вариантов как работают дескрипторные ДМА больше чем один, то читать гугл/вики на эту тему, или другие научнопопулярные ресурсы, смысла особо нет, разве только для общего развития.
Go to the top of the page
 
+Quote Post
soldat_shveyk
сообщение Oct 23 2012, 06:29
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 3-07-07
Из: С-Петербург
Пользователь №: 28 859



Спасибо, Shivers.
Chaining dma меня этим и прельстило - хочется качать непрерывный поток данных до 800 МБ/с, по возможности не сильно загружая процессор.
Альтеровские доки читаю уже не знаю по какому разу - а пазл в голове все не складывается.
Не могу найти ответ - кто является генератором дескипторов. Вроде бы они должны формироваться в драйвере и как-то передаваться в плату.
Как давать прерывания чтобы драйвер знал, какой именно дескриптор готов?
Раньше я делел так - запрашивал в драйвере кусок NonPageble памяти 128 МБайт, передавал физический адрес начала в один из регистров платы, затем отправлял
в эту память данные, и в конце передачи давал прерывание, которое перехватывалось драйвером и взводило Event для приложения в третьем кольце.
Как дейстовать сейчас?
Запрашивать 4 куска памяти по 32 Мбайта и передавать их адреса в качестве дескриптров?

Go to the top of the page
 
+Quote Post
Shivers
сообщение Oct 23 2012, 14:17
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950



По порядку
Таблица дескрипторов прописывается в некую область памяти ( делает это обычно процессор, хотя возможны варианты ). Софт, который это делает, назовем драйвером, если вам так удобно.
Таблиц дескрипторов может быть несколько. Есть режимы, когда ДМА контроллер работает одновременно с двумя таблицами (к примеру, т.н. режим pig-pong). Можно заранее прописать несколько таблиц дескрипторов и скармливать их ДМА по очереди.
Когда ДМА доходил то конца таблицы, формируется прерывание. Встречал вариант, когда прерывание выставляется на каждый 1/2/4/8/16 и т.д. дескриптор - т.е. многократно. Именно так ДМА контроллер сообщает процессору, что данные отправлены/приняты.
В некоторых случаях может использоваться система семафоров - процессор открывает, дма закрывает. по статусу семафора видно, в каком месте таблицы работает ДМА.
Драйвер же, получив прерывание ДМА, должен забрать (режим чтения) либо подготовить (режим записи) данные, подсунуть новую таблицу, ... и т.д. и т.п. - вариантов что делать драйверу много, зависят от типа ДМА.

Я говорю только общие вещи, поскольку реализация ДМА у альтеры мне не известна, а читать доки нет времени, сорри ) Может быть кто то ответит, кто в теме
Go to the top of the page
 
+Quote Post
soldat_shveyk
сообщение Oct 24 2012, 06:51
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 3-07-07
Из: С-Петербург
Пользователь №: 28 859



Спасибо, Shivers.
Уже что-то начинает вырисовываться.
Go to the top of the page
 
+Quote Post
soldat_shveyk
сообщение Oct 26 2012, 07:00
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 3-07-07
Из: С-Петербург
Пользователь №: 28 859



Вроде бы разобрался как запускать chaining DMA, таблицу дескрипторов надо создавать самому в области памяти, доступной по физическому адресу (Non Pagable).
Количество дескрипторов и начальный адрес таблицы дескрипторов отправить в регистр управления DMA находящийся в BAR1 платы.
Буду пробовать запустить DMA альтеровского примера под своим драйвером и приложением.
Пока что не нашел ответ - какое максимальное количество памяти можно выделить под дескрипторы.
Допустим, на компе 16 GB RAM, получится ли занять например 8 GB?

Уважаемые, кто запускал DMA Write на мощных FPGA от Альтеры с HARD IP (Stratix IV, Stratix V) - какую реальную скорость непрерывной передачи удалось получить?
Интересуют режимы PCIe 8x, g2, g3.

Go to the top of the page
 
+Quote Post
krux
сообщение Oct 26 2012, 16:46
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



немного теории.
как известно, DMA может читать и писать только линейно непрерывные области физической памяти. Scatter-Gather DMA избавляет от требования по непрерывности.
В общем случае принцип такой - драйвер записывает в бар адрес дескриптора (либо таблицы с дескрипторами - массив указателей на указатели). DMA-контроллер вычитывает их себе, и пишет по адресам, указанным в дескрипторах.
Максимальный размер выделяемого непрерывного участка памяти зависит от операционки. Соответствующий кусок (или куча кусочков) памяти выделяется в драйвере.
Например, для Linux - линейно можно выделить только стандартные 4к (больше можно сделать только накатывая специальные патчи на ядро, на такой фигней уже давно никто не занимаетя).
В WinXP можно линейно выделить и 128М, при этом на время выделения всё подвиснет, бывает подвисает секунд на 30 ;-) пока переместит куски программ по другим местам. (предельного значения явно не задано, но при попытке выделить чтото достаточно большого объема драйверу просто выдается ошибка - недостаточно памяти, и в зависимости от степени кривости написания драйвера, всё может упасть в синий экран)
В Win7 коллеги говорили что максимальный размер уменьшили, но насколько точно - не скажу.
соответственно, в Linux например, можно за 1 раз загнать в контроллер 4кбайт дескрипторов, и по ним записать за 1 прерывание 4М памяти для 32-битных архитектур.

Далее всё зависит от специфики вашего приложения. Если все данные надо передавать пользовательской программе (aka в userspace) - то у вас проблемы. Например в Linux обратиться к памяти, выделенной драйвером, из пользовательской программы нельзя - соответственно будет копирование памяти, на чём может потеряться прилично производительности. В WinXP доступ получить можно, а вот в Win7 тоже будут проблемы, либо придется запускать "с правами Администратора". Либо как вариант переносить всю обработку в драйвер, но это чревато.

А вообще, прежде чем тащить "всё что прилетело" (это я про 8 гиг памяти, занятой данными) к процессору - лишний раз подумайте, допустимы ли дропы в вашем комплексе, и если нет - то обрабатывайте аппаратно, а через PCIe тащите только результаты.

Сообщение отредактировал krux - Oct 26 2012, 16:52


--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
Go to the top of the page
 
+Quote Post
soldat_shveyk
сообщение Oct 26 2012, 17:32
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 3-07-07
Из: С-Петербург
Пользователь №: 28 859



Спасибо, krux, за полезную информацию.
Потери данных (дропы, если правильно понял) у меня не допустимы.
Все поступающие данные надо передавать пользовательской программе.
Но пока что планирую работать в режиме старт-стоп. Закачать данные из платы в память, остановить DMA,
затем обрабатывать в userspace. От промежуточного копирования хотел отказаться, поэтому и спаршивал - как много памяти можно выделить в драйвере.

Кстати, а чем череват перенос обработки в драйвер?
Например в ISR или DPC. Я понимаю, что надолго занимать эти процессы не имею права, но вот на сколько можно притормозить, например Isr?
Все-таки выполнение ISR обладает высочайшим приоритетом, по сравнению с потоками в userspace.



Go to the top of the page
 
+Quote Post
krux
сообщение Oct 26 2012, 18:29
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



Дропы - да, потери данных.

Для Linux перенос большого количества кода в ISR приводит к тому, что ядро видит (через rdtsc и подобные механизмы) что ISR выполняется слишком долго, считает что это interupt thrashing, и тупо маскирует прерывание, после чего код драйвера больше не вызывается ядром вообще. Помогает только перезагрузка.

Про win сейчас точно не скажу, sorry.

В DPC обычно пишут то, что надо бы выполнить по приходу прерывания, но этот кусок кода при этом не является критическим с точки зрения общения непосредственно с железом (DMA-контроллером), поэтому может быть отложен относительно момента вызова ISR. И в нём, в принципе, можно написать довольно много чего. Проблемы - как обычно, с синхронизацией с другими I/O. Например, если вы собираетесь записывать "всё что прилетает" на диски (рейд там, или чтото подобное, для пост-обработки) то мое мнение - что это не взлетит.

Большие объемы данных, насколько мне известно, обрабатывают совсем по другому. Взять хоть тех же LHC (ATLAS/CMS) и их архитектуру переноса real-time triggers (а там по 1,5 гигабайта/сек сырых данных) в их Tier0 storage.


--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 18:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016