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

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

 

Вопрос к тому, кто копал данный сабж поглубже, а именно на предмет работы контроллера SDMA. Решил посмотреть, с какой скоростью он перекачивает данные из памяти в память, копировал блоками по 64Кб (16384х32 бита) (больше за одну транзакцию он не может). Создал 21 транзакцию (buffer descriptor) (1376235 байт) И засек время, итого получилось 30 копирований в сек. Что составляет примерно 42 мегабайта в сек.

Это очень мало, если сравнить, например, скорость выдачи данных на дисплей - при разрешении 1024х768, 32х битном цвете и 2хслойной графике - это будет 158 мегабайт в сек. Что в несколько раз быстрее. Конечно, здесь разные получатели, в первом случае память, во втором дисплейный порт, но это не должно давать такой разницы.

 

Может у кого есть варианты, почему так и можно-ли ускорить копирование?

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


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

Может у кого есть варианты, почему так и можно-ли ускорить копирование?

А что делал CPU и другие bus-master-ы во время этого теста?

Если он у Вас крутился в цикле ожидания некоего флага и постоянно перечитывал из памяти участок кода с циклом и приоритет доступа к шине у CPU выше чем у DMA, то в таком случае вообще ничего гарантировать нельзя - DMA в таком случае может и вообще ни одной транзакции не выполнить.

Вобщем - непонятно как меряете - правильно ли? Или среднюю температуру по больнице? ;)

Думаю, что если положить CPU в сон на время копирования, то процесс может ускориться.

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


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

А что делал CPU и другие bus-master-ы во время этого теста?

Если он у Вас крутился в цикле ожидания некоего флага и постоянно перечитывал из памяти участок кода с циклом и приоритет доступа к шине у CPU выше чем у DMA, то в таком случае вообще ничего гарантировать нельзя - DMA в таком случае может и вообще ни одной транзакции не выполнить.

Вобщем - непонятно как меряете - правильно ли? Или среднюю температуру по больнице? ;)

Думаю, что если положить CPU в сон на время копирования, то процесс может ускориться.

 

Да, процессор ждал флага, с памятью работал только видеомодуль, отображая статическую картинку из пямяти.

 

Не забывайте одну вещь - у процессора есть кэш 1 и 2го уровня, причем большой (64+512Кбайт), вся программа умещается в него т.ч. к памяти (в смысле внешней) он не лезет вообще...

 

На счет результатов и "средней температуры" - за конкретными цифрами и их точностью не гонюсь, мне гораздо интереснее, можно-ли что ускорить, результаты были получены, измеряя скорость 5 раз, и были одинаковыми, что исключает влияние каких-либо случайных процессов. Программа baremetal, ОС не использовалось.

Изменено пользователем mantech

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


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

А на какой частоте работает DMA? И сколько тактов длится копирование одного слова - считали?

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


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

А на какой частоте работает DMA? И сколько тактов длится копирование одного слова - считали?

 

На какой частоте - честно не смотрел, конфигурация по дефолту, но глянуть, пожалуй, можно.

Сколько тактов - подсчитать довольно сложно.

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


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

копировал блоками по 64Кб (16384х32 бита) (больше за одну транзакцию он не может). Создал 21 транзакцию (buffer descriptor) (1376235 байт) И засек время, итого получилось 30 копирований в сек. Что составляет примерно 42 мегабайта в сек.

Если я правильно понял, то это будет 64К * 21 * 30 = 39МБ/сек чтений и столько же записей.

 

Это очень мало, если сравнить, например, скорость выдачи данных на дисплей - при разрешении 1024х768, 32х битном цвете и 2хслойной графике - это будет 158 мегабайт в сек.

26кадров/сек?

 

Что в несколько раз быстрее.

А вот тут начинается самое интересное - SDRAM память нетороплива при случайных обращениях, но шустро отдает/принимает данные блоками. Выдача данных на дисплей скорее всего идет через буфер, по последовательным адресам и издержки получаются минимальные. Стоит посмотреть имеется ли буфер (и какой) у SDMA, поскольку если для каждого 32битного слова дергать память на чтение/запись, да еще и по разным адресам производительность сильно просядет (тем более у Вас и так подсистема памяти нагружена выводом на дисплей).

 

Кстати для ускорения можно положить видеобуфер, буфер откуда данные копируются и буфер куда данные копируются в разные банки памяти ;).

 

P.S. А память то какая (DDR3?) и на какой частоте работает?

P.P.S. Заглянул в доки, я надеюсь Вы используете burst DMA unit?

Изменено пользователем Шаманъ

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


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

Если я правильно понял, то это будет 64К * 21 * 30 = 39МБ/сек чтений и столько же записей.

 

 

26кадров/сек?

 

 

А вот тут начинается самое интересное - SDRAM память нетороплива при случайных обращениях, но шустро отдает/принимает данные блоками. Выдача данных на дисплей скорее всего идет через буфер, по последовательным адресам и издержки получаются минимальные. Стоит посмотреть имеется ли буфер (и какой) у SDMA, поскольку если для каждого 32битного слова дергать память на чтение/запись, да еще и по разным адресам производительность сильно просядет (тем более у Вас и так подсистема памяти нагружена выводом на дисплей).

 

Кстати для ускорения можно положить видеобуфер, буфер откуда данные копируются и буфер куда данные копируются в разные банки памяти ;).

 

P.S. А память то какая (DDR3?) и на какой частоте работает?

P.P.S. Заглянул в доки, я надеюсь Вы используете burst DMA unit?

 

39МБ/сек чтений и столько же записей. - конечно, нужно прочитать по одному адресу и записать в другой.

 

ДМА работает в режиме линейного адреса, поэтому режиму burst DMA никто не мешает, в даташите написано, что копирует по 16 байт в блоке.

 

А память то какая (DDR3?) и на какой частоте работает?

DDR3 шириной 32 бита на частоте 400МГц. Судя по этому должна быть очень шустрой :rolleyes:

Изменено пользователем mantech

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


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

DDR3 шириной 32 бита на частоте 400МГц. Судя по этому должна быть очень шустрой :rolleyes:

По моему (весьма небольшому) опыту работы с i.MX6, создалось впечатление, что шустрым на нем не бывает ничего в принципе.

Скажем, в tinymembench i.MX6Q с x64 LPDDR2 @ 400MHz умудряется местами сливать в 2(!) раза Allwinner'у A20 с x32 DDR3 @ 400MHz.

Так что не удивлюсь, если с SDMA такое же "не шмогла", как с гигабитным Ethernet'ом и прочим.

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


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

в даташите написано, что копирует по 16 байт в блоке.

Т.е. по 4ре слова, ИМХО, это мало для того, чтобы эффективно использовать полосу SDRAM по полной.

 

Проведите простой эксперимент - просто вычитайте через SDMA какой-нить достаточно большой кусок SDRAMа (страницу, например), и второй эксперимент - просто запишите такой же кусок SDRAMa, а потом сравните время просто чтения, просто записи и копирования по 4ре слова, можете еще поиграться с выводом на дисплей (тест с отключенным и с включенным). Думаю кое-что может проясниться.

 

DDR3 шириной 32 бита на частоте 400МГц. Судя по этому должна быть очень шустрой :rolleyes:

Это при работе достаточно большими блоками, а случайным доступом или очень маленькими блоками можно производительность SDRAM легко убить.

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


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

ДМА работает в режиме линейного адреса, поэтому режиму burst DMA никто не мешает, в даташите написано, что копирует по 16 байт в блоке.

А почему кстати "байт", а не "слов"? Вы надеюсь DMA не в байтовом режиме запускаете?

Ещё часто DMA-контроллеры имеют возможность блокировки шины на время burst-пересылки - можно попробовать использовать её и посмотреть что получится.

Да, конечно, для теста нужно отключить все прочие активности, делать тест только чтения (или только записи). Во внутреннюю память.

Можно отключить рефреш SDRAM на время теста - может какие-то проблемы с конфигурированием SDRAM?

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


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

В любом случае ловить особо нечего.

Имхо - наоборот. Раз есть такая разница в результатах, значит есть какие-то факторы на неё влияющие приводящие к таким разным данным. И значит есть перспективы для изменения этих факторов. Вот если-б данные были примерно такими-же - тогда да.....

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


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

Раз есть такая разница в результатах, значит есть какие-то факторы на неё влияющие приводящие к таким разным данным.

Основным влияющим фактором, думаю, является кривой код примера в первом случае.

 

И значит есть перспективы для изменения этих факторов. Вот если-б данные были примерно такими-же - тогда да.....

А есть, например, перспективы получения скорости обмена через Ethernet более 400Мбит/с? Вот и здесь, похоже, перспективы аналогичные.

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


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

А почему кстати "байт", а не "слов"? Вы надеюсь DMA не в байтовом режиме запускаете?

Ещё часто DMA-контроллеры имеют возможность блокировки шины на время burst-пересылки - можно попробовать использовать её и посмотреть что получится.

Да, конечно, для теста нужно отключить все прочие активности, делать тест только чтения (или только записи). Во внутреннюю память.

Можно отключить рефреш SDRAM на время теста - может какие-то проблемы с конфигурированием SDRAM?

 

Просто я ошибся, конечно блок 16 DWords. Копирую тоже по 32бита. Без графики не пробовал, просто потому, что без нее нет смысла в этом копировании вообще :biggrin:

 

Основным влияющим фактором, думаю, является кривой код примера в первом случае.

 

 

А есть, например, перспективы получения скорости обмена через Ethernet более 400Мбит/с? Вот и здесь, похоже, перспективы аналогичные.

 

Ну 19метров - это надо искусственно тормозить или многослойную графику фуллХД включать, у меня как раз ближе ко второму результату.

 

ЗЫ. Сейчас осваиваю аллвиннер, посмотрим, что на нем будет :laughing:

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


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

ЗЫ. Сейчас осваиваю аллвиннер, посмотрим, что на нем будет :laughing:

 

 

Вообщем, дошли руки до теста А13

С чем запускалось:

DDR333-16bit mode - 168MHz clock. MMU Enable, DDR Region no cashed, SRAM Region cashed. CPU Clock 682MHz.

 

Вот что получилось:

 

Тест копирования с помощью DMA - копировались блоки по 3 МБайта

Без включенного видеоконтроллера 65-72 Мбайт\сек

С видеоконтроллером (1024х600х32) - 55-59 Мбайт\сек

 

Вот такие дела, и это при том, что МХ6 ДДР - 400 и 32 Бита!!!

 

ДМА в А13 очень понравился, процедура запуска 10 строчек кода, полная поддержка 2D-режима, жаль в V3s его заменили на МХ6-подобную хрень с кучей дескрипторов :crying:

 

Ну и больше 682МГц проц завести не удалось - нужно делать выше питание, 1.2В больше не тянут, как у олимексовцев получилось запустить гигагерц на 1.2В - для меня загадка :laughing:

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


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

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

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

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

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

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

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

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

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

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