mantech 53 7 апреля, 2018 Опубликовано 7 апреля, 2018 · Жалоба Приветствую. Вопрос к тому, кто копал данный сабж поглубже, а именно на предмет работы контроллера SDMA. Решил посмотреть, с какой скоростью он перекачивает данные из памяти в память, копировал блоками по 64Кб (16384х32 бита) (больше за одну транзакцию он не может). Создал 21 транзакцию (buffer descriptor) (1376235 байт) И засек время, итого получилось 30 копирований в сек. Что составляет примерно 42 мегабайта в сек. Это очень мало, если сравнить, например, скорость выдачи данных на дисплей - при разрешении 1024х768, 32х битном цвете и 2хслойной графике - это будет 158 мегабайт в сек. Что в несколько раз быстрее. Конечно, здесь разные получатели, в первом случае память, во втором дисплейный порт, но это не должно давать такой разницы. Может у кого есть варианты, почему так и можно-ли ускорить копирование? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 7 апреля, 2018 Опубликовано 7 апреля, 2018 · Жалоба Может у кого есть варианты, почему так и можно-ли ускорить копирование? А что делал CPU и другие bus-master-ы во время этого теста? Если он у Вас крутился в цикле ожидания некоего флага и постоянно перечитывал из памяти участок кода с циклом и приоритет доступа к шине у CPU выше чем у DMA, то в таком случае вообще ничего гарантировать нельзя - DMA в таком случае может и вообще ни одной транзакции не выполнить. Вобщем - непонятно как меряете - правильно ли? Или среднюю температуру по больнице? ;) Думаю, что если положить CPU в сон на время копирования, то процесс может ускориться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 7 апреля, 2018 Опубликовано 7 апреля, 2018 (изменено) · Жалоба А что делал CPU и другие bus-master-ы во время этого теста? Если он у Вас крутился в цикле ожидания некоего флага и постоянно перечитывал из памяти участок кода с циклом и приоритет доступа к шине у CPU выше чем у DMA, то в таком случае вообще ничего гарантировать нельзя - DMA в таком случае может и вообще ни одной транзакции не выполнить. Вобщем - непонятно как меряете - правильно ли? Или среднюю температуру по больнице? ;) Думаю, что если положить CPU в сон на время копирования, то процесс может ускориться. Да, процессор ждал флага, с памятью работал только видеомодуль, отображая статическую картинку из пямяти. Не забывайте одну вещь - у процессора есть кэш 1 и 2го уровня, причем большой (64+512Кбайт), вся программа умещается в него т.ч. к памяти (в смысле внешней) он не лезет вообще... На счет результатов и "средней температуры" - за конкретными цифрами и их точностью не гонюсь, мне гораздо интереснее, можно-ли что ускорить, результаты были получены, измеряя скорость 5 раз, и были одинаковыми, что исключает влияние каких-либо случайных процессов. Программа baremetal, ОС не использовалось. Изменено 7 апреля, 2018 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 7 апреля, 2018 Опубликовано 7 апреля, 2018 · Жалоба А на какой частоте работает DMA? И сколько тактов длится копирование одного слова - считали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 7 апреля, 2018 Опубликовано 7 апреля, 2018 · Жалоба А на какой частоте работает DMA? И сколько тактов длится копирование одного слова - считали? На какой частоте - честно не смотрел, конфигурация по дефолту, но глянуть, пожалуй, можно. Сколько тактов - подсчитать довольно сложно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Шаманъ 1 14 апреля, 2018 Опубликовано 14 апреля, 2018 (изменено) · Жалоба копировал блоками по 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? Изменено 14 апреля, 2018 пользователем Шаманъ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 17 апреля, 2018 Опубликовано 17 апреля, 2018 (изменено) · Жалоба Если я правильно понял, то это будет 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: Изменено 17 апреля, 2018 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 17 апреля, 2018 Опубликовано 17 апреля, 2018 · Жалоба DDR3 шириной 32 бита на частоте 400МГц. Судя по этому должна быть очень шустрой :rolleyes: По моему (весьма небольшому) опыту работы с i.MX6, создалось впечатление, что шустрым на нем не бывает ничего в принципе. Скажем, в tinymembench i.MX6Q с x64 LPDDR2 @ 400MHz умудряется местами сливать в 2(!) раза Allwinner'у A20 с x32 DDR3 @ 400MHz. Так что не удивлюсь, если с SDMA такое же "не шмогла", как с гигабитным Ethernet'ом и прочим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Шаманъ 1 18 апреля, 2018 Опубликовано 18 апреля, 2018 · Жалоба в даташите написано, что копирует по 16 байт в блоке. Т.е. по 4ре слова, ИМХО, это мало для того, чтобы эффективно использовать полосу SDRAM по полной. Проведите простой эксперимент - просто вычитайте через SDMA какой-нить достаточно большой кусок SDRAMа (страницу, например), и второй эксперимент - просто запишите такой же кусок SDRAMa, а потом сравните время просто чтения, просто записи и копирования по 4ре слова, можете еще поиграться с выводом на дисплей (тест с отключенным и с включенным). Думаю кое-что может проясниться. DDR3 шириной 32 бита на частоте 400МГц. Судя по этому должна быть очень шустрой :rolleyes: Это при работе достаточно большими блоками, а случайным доступом или очень маленькими блоками можно производительность SDRAM легко убить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 18 апреля, 2018 Опубликовано 18 апреля, 2018 · Жалоба ДМА работает в режиме линейного адреса, поэтому режиму burst DMA никто не мешает, в даташите написано, что копирует по 16 байт в блоке. А почему кстати "байт", а не "слов"? Вы надеюсь DMA не в байтовом режиме запускаете? Ещё часто DMA-контроллеры имеют возможность блокировки шины на время burst-пересылки - можно попробовать использовать её и посмотреть что получится. Да, конечно, для теста нужно отключить все прочие активности, делать тест только чтения (или только записи). Во внутреннюю память. Можно отключить рефреш SDRAM на время теста - может какие-то проблемы с конфигурированием SDRAM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 18 апреля, 2018 Опубликовано 18 апреля, 2018 · Жалоба Больше 19МБайт/с!!!!1111 Или даже 50-60 В любом случае ловить особо нечего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 18 апреля, 2018 Опубликовано 18 апреля, 2018 · Жалоба В любом случае ловить особо нечего. Имхо - наоборот. Раз есть такая разница в результатах, значит есть какие-то факторы на неё влияющие приводящие к таким разным данным. И значит есть перспективы для изменения этих факторов. Вот если-б данные были примерно такими-же - тогда да..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 18 апреля, 2018 Опубликовано 18 апреля, 2018 · Жалоба Раз есть такая разница в результатах, значит есть какие-то факторы на неё влияющие приводящие к таким разным данным. Основным влияющим фактором, думаю, является кривой код примера в первом случае. И значит есть перспективы для изменения этих факторов. Вот если-б данные были примерно такими-же - тогда да..... А есть, например, перспективы получения скорости обмена через Ethernet более 400Мбит/с? Вот и здесь, похоже, перспективы аналогичные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 18 апреля, 2018 Опубликовано 18 апреля, 2018 · Жалоба А почему кстати "байт", а не "слов"? Вы надеюсь DMA не в байтовом режиме запускаете? Ещё часто DMA-контроллеры имеют возможность блокировки шины на время burst-пересылки - можно попробовать использовать её и посмотреть что получится. Да, конечно, для теста нужно отключить все прочие активности, делать тест только чтения (или только записи). Во внутреннюю память. Можно отключить рефреш SDRAM на время теста - может какие-то проблемы с конфигурированием SDRAM? Просто я ошибся, конечно блок 16 DWords. Копирую тоже по 32бита. Без графики не пробовал, просто потому, что без нее нет смысла в этом копировании вообще Основным влияющим фактором, думаю, является кривой код примера в первом случае. А есть, например, перспективы получения скорости обмена через Ethernet более 400Мбит/с? Вот и здесь, похоже, перспективы аналогичные. Ну 19метров - это надо искусственно тормозить или многослойную графику фуллХД включать, у меня как раз ближе ко второму результату. ЗЫ. Сейчас осваиваю аллвиннер, посмотрим, что на нем будет :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 26 апреля, 2018 Опубликовано 26 апреля, 2018 · Жалоба ЗЫ. Сейчас осваиваю аллвиннер, посмотрим, что на нем будет :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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться