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

 
 
> Kinetis K70, DMA, memcpy: сравнение скорости копирования., DMA почему то проигрывает
shreck
сообщение Sep 25 2014, 11:57
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328



Имеем K70 c внешней DDRAM.
Сравниваю скорость копирования блока памяти 500KB из одного места DDRAM в другое место DDRAM.
Оба метода работают в одинаковых условиях.

штатная memcpy: 12ms.
DMA (16-byte burst режим): 18ms.

DMA медленнее.
Как можно объяснить эти результаты.
Может что-то недоглядел/недонастроил в этом DMA.

P.S. По запарке не в тот раздел запостил.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
AlexandrY
сообщение Sep 25 2014, 19:31
Сообщение #2


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(shreck @ Sep 25 2014, 14:57) *
Имеем K70 c внешней DDRAM.
Сравниваю скорость копирования блока памяти 500KB из одного места DDRAM в другое место DDRAM.
Оба метода работают в одинаковых условиях.

штатная memcpy: 12ms.
DMA (16-byte burst режим): 18ms.

DMA медленнее.
Как можно объяснить эти результаты.
Может что-то недоглядел/недонастроил в этом DMA.

P.S. По запарке не в тот раздел запостил.


Ну это уж давно известный эффект.
Начиная еще с ARM7 у ARM-ов DMA всегда работал медленней программной пересылки.
Но зато DMA не может больше чем на 50% замедлить прокачку данных и команд для процессора.
Кстати надо еще играться приоритетами портов коммутатора шин.

Go to the top of the page
 
+Quote Post
shreck
сообщение Sep 26 2014, 01:38
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328



Цитата(AlexandrY @ Sep 26 2014, 02:31) *
Ну это уж давно известный эффект.
Начиная еще с ARM7 у ARM-ов DMA всегда работал медленней программной пересылки.
Но зато DMA не может больше чем на 50% замедлить прокачку данных и команд для процессора.
Кстати надо еще играться приоритетами портов коммутатора шин.

Ясненько. Спасибо.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 27 2014, 13:56
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(shreck @ Sep 25 2014, 17:57) *
DMA медленнее.
Как можно объяснить эти результаты.
Может что-то недоглядел/недонастроил в этом DMA.

А что у Вас в этот момент делал CPU? Может он шину загрузил (у него наверное приоритет доступа к шине выше чем у DMA?) крутясь в пустом цикле?
Go to the top of the page
 
+Quote Post
shreck
сообщение Sep 29 2014, 02:36
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328



Убрал из idle задачи доступ к ОЗУ, скорость dma возрасла в 2 раза (9ms стало).
Повышение приоритета dma также уменьшает время до 9ms.
И, видимо, это предел, т.к. применение обоих условий, более не уменьшает время копирования.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Sep 29 2014, 12:11
Сообщение #6


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(shreck @ Sep 29 2014, 05:36) *
Убрал из idle задачи доступ к ОЗУ, скорость dma возрасла в 2 раза (9ms стало).
Повышение приоритета dma также уменьшает время до 9ms.
И, видимо, это предел, т.к. применение обоих условий, более не уменьшает время копирования.


Тут надо убедится, что memcpy работает с выровненными данными, а то иначе она медленней работает раза в два.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 29 2014, 16:30
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(shreck @ Sep 29 2014, 08:36) *
Убрал из idle задачи доступ к ОЗУ, скорость dma возрасла в 2 раза (9ms стало).

Лучшее решение - idle-задача состоящая из одной инструкции WFE в цикле!

Как-то (не помню уже на каком именно CPU) сталкивался с ситуацией, что у меня затыкался DMA (вообще, из-за таймаута доступа к шине)
из-за того, что CPU, ожидая флага о завершении DMA-транзакции крутился в пустом цикле. Размер этого цикла (команд) был очень маленький,
и сам цикл лежал ещё на границе элемента предвыборки инструкций (весь цикл нельзя было загрузить одним prefetch). Из-за этого шина
постоянно была занята непрерывными операциями выборки команд этого цикла и никакой другой bus master не мог получить доступа к ней.
Вроде это было на ком-то из LPC175/6x.
И самое поганое было в том, что при малейшем изменении кода (в любом месте) этот самый цикл сдвигался немного в памяти и всё чудесным образом начинало работать.
Но недолго, до след. модификации. wink.gif
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Sep 29 2014, 17:18
Сообщение #8


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Sep 29 2014, 19:30) *
Как-то (не помню уже на каком именно CPU) сталкивался с ситуацией, что у меня затыкался DMA (вообще, из-за таймаута доступа к шине)


NXP небось и не в курсе что у них DMA "затыкается",
а еще есть где-то скрытый регистр со статусом "таймаута доступа к шине". biggrin.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 29 2014, 22:07
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Sep 29 2014, 23:18) *
а еще есть где-то скрытый регистр со статусом "таймаута доступа к шине". biggrin.gif

где? и зачем он?
Go to the top of the page
 
+Quote Post
shreck
сообщение Sep 30 2014, 01:50
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328



Цитата(AlexandrY @ Sep 29 2014, 19:11) *
Тут надо убедится, что memcpy работает с выровненными данными, а то иначе она медленней работает раза в два.

Выравнивание на границу 16 байт. Здесь все в порядке.

Цитата(jcxz @ Sep 29 2014, 23:30) *
Лучшее решение - idle-задача состоящая из одной инструкции WFE в цикле!

Это само собой. Просто исходно idle задача была штатной от ОСи. Заменил на свою.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Sep 30 2014, 07:33
Сообщение #11


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Sep 30 2014, 01:07) *
где? и зачем он?


А как вы узнали про таймаут? В мануале на LPC17xx таймаут шины нигде не упоминается.

Цитата(shreck @ Sep 30 2014, 04:50) *
Выравнивание на границу 16 байт. Здесь все в порядке.

Это само собой. Просто исходно idle задача была штатной от ОСи. Заменил на свою.


Тогда надо еще указать компилятор и опции компиляции потому как memcpy у всех сильно отличается.

А на какую задачу заменили. И зачем вообще включили MQX?
Там же сразу идет инициализация кучи периферии с прерываниями и системный тик включается. Оно надо для таких тестов?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 30 2014, 07:59
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Sep 30 2014, 13:33) *
А как вы узнали про таймаут? В мануале на LPC17xx таймаут шины нигде не упоминается.

Не "таймаут шины", а "таймаут доступа DMA-контроллера к шине".
Я сделал вывод из симптомов:
1. Перенос цикла в ОЗУ - решало проблему.
2. Выравнивание начала цикла на границу предвыборки - решало проблему.
3. Увеличение кол-ва команд в цикле - решало проблему.
4. Ранее на другом CPU (CC5502) сталкивался с подобной проблемой. Там генерилось прерывание ошибки, о котором так и говорилось "генерится после 512 (вроде) безуспешных попыток доступа к шине DMA-контроллера".
К тому-же у LPC175/6x приоритет доступа к шине CPU всегда выше чем у DMA и изменить это невозможно sad.gif((( Это исправлено только в LPC177/8x.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Sep 30 2014, 08:45
Сообщение #13


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Sep 30 2014, 10:59) *
Не "таймаут шины", а "таймаут доступа DMA-контроллера к шине".
Я сделал вывод из симптомов:


Ну так вы имеете просто нерешенную проблему.
Я тоже исследовал влияние выполнение кода на работу DMA.
И с простыми циклами и с Whetstone и с одновременным выполнением memcpy.
На STM32. И ничего подобного не наблюдал.

Может быть у вас DMA был плохо настроен, может еще что, но переносить этот неудачный опыт на K70 нет оснований.
Go to the top of the page
 
+Quote Post
shreck
сообщение Sep 30 2014, 09:09
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328



Цитата(AlexandrY @ Sep 30 2014, 14:33) *
Тогда надо еще указать компилятор и опции компиляции потому как memcpy у всех сильно отличается.

А на какую задачу заменили. И зачем вообще включили MQX?
Там же сразу идет инициализация кучи периферии с прерываниями и системный тик включается. Оно надо для таких тестов?

IAR 7.20.2 High Balanced почти все опции включены.
MQX с работающими задачами нужна для того, чтобы оценить время копирования в реальных условиях. А предельное значение времени работы memcpy при остановленной MQX составляет те же ~12ms.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Sep 30 2014, 09:53
Сообщение #15


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(shreck @ Sep 30 2014, 12:09) *
IAR 7.20.2 High Balanced почти все опции включены.
MQX с работающими задачами нужна для того, чтобы оценить время копирования в реальных условиях. А предельное значение времени работы memcpy при остановленной MQX составляет те же ~12ms.


Хороший выбор.

А как время измеряете?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 10:02
Рейтинг@Mail.ru


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