Скорость работы кода обычного приложения и приложения VDK |
![]() |
Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
При проектировании приложений, где процессор сильно загружен вычислениями (например, цифровая обработка сигналов), встает вопрос оценки быстродействия кода, когда он работает в разных условиях - обычное приложение, приложение VDK. Также важно с точки зрения выбора компромисса в распределении памяти узнать, насколько изменится скорость вычислений при выборе памяти для кода L1 или L3, или при выборе памяти для данных L1 или L3. В этой статье приведена информация по тестированию скорости работы кода в различных условиях. [Как тестировалась скорость выполнения кода] Скорость работы кода оценивалась комбинированным тестом, выполняющимся на процессоре Blackfin ADSP-BF538, частота ядра (CCLK) 327.68 МГц, частота шины 32.768 МГц. В начале тестируемого блока кода ножка порта устанавливалась в лог. 0 (зажигался светодиод), и в конце тестируемого кода ножка порта устанавливалась в лог. 1 (светодиод гас). Длительность интервала времени между этими двумя моментами измерялась с помощью осциллографа - чем интервал меньше, тем код работает быстрее. Один цикл теста выглядел следующим образом: LED(1); //Зажечь светодиод: начало теста fill_mem_rand_values(); //Заполнить память псевдослучайными значениями (запись в память) check_mem_rand_values(); //Проверить псевдослучайную последовательность в памяти (чтение памяти) LED(0); //Погасить светодиод: конец теста Этот код был проверен в разных условиях: с включенной и выключенной оптимизацией, с размещением кода в памяти L1 и L3, с размещением тестируемого блока данных в памяти в L1 и L3, в условиях работы кода в обычном (не VDK) приложении и в условиях низкоприоритетного потока приложения VDK. Код, генерирующий псевдослучайную последовательность, был взят из кода FreeBSD (см. [1]), и его работа тестировалась как из памяти L1, так и из памяти L3. Результаты тестирования можно увидеть в таблицах ниже. Таблица 1. Скорость работы кода в приложении VDK.
Примечания к таблице 1: (1) Аббревиатурами ADC, UART, KBD, BAT и SCREEN показано, какие потоки работали в этом варианте измерения скорости кода (поток АЦП, последовательного порта консоли, опроса напряжения батареи и обновления экрана соответственно). Таблица 2. Скорость работы кода в обычном приложении (не VDK).
Примечания к таблице 1: (1) В этом столбце показано относительное сравнение различных результатов тестирования, за 100% взят самый худший случай из таблицы 1 (1 строка таблицы, когда и код, и данные находятся в SDRAM), когда код выполняется медленнее всего. Оба приложения работали на процессоре ADSP-BF538 с тактовой частотой ядра 327.28 МГц (CCLK) и частотой шины 32.768 МГц (SCLK). К процессору была подключена внешняя память SDRAM на 32 мегабайта. В приложении VDK работала система чтения АЦП (через SPORT, с помощью DMA с двойной буферизацией), поток анализа нажатий клавиатуры, поток обновления экрана ЖКИ (через SPI, также с использованием DMA), поток обработки порта UART (управляющая консоль), поток чтения батареи BAT (передача через SPI с использованием прерываний). Работа с аппаратурой производилась с помощью системы драйверов ADI (библиотека SSL). В обычном приложении код выполнялся в главном цикле main, и поверх него работал только обработчик прерывания таймера, в котором был вставлен код опроса клавиатуры. [Выводы] 1. Код выполняется в 5 раз быстрее, если он размещен в памяти L1 (код находится в секции L1_code), по сравнению с памятью L3 (код находится в секции sdram0). 2. Код выполняется примерно в 1.1 раза быстрее, если он обрабатывает данные, размещенные в памяти L1 (данные находятся в секции L1_data), по сравнению с данными, находящимися в L3 (данные находятся в секции sdram0). Т. е. для обычной обработки, где обращение к памяти занимают незначительную часть времени, тип памяти не имеет большого значения. Но для для операций, где обращение к памяти занимает большую часть (например, для работы функции memcpy), выигрыш от использования памяти L1 может быть пятикратный. 3. Код обычного приложения выполняется примерно в 1.1..1.2 раза быстрее, чем код, который выполняется в низкоприоритетном потоке приложения VDK. Таким образом, использование VDK незначительно снижает скорость выполнения кода. 4. Включение оптимизации ускоряет работу кода примерно в 1.5 раза, независимо от прочих условий. [Ссылки] |