Программирование DSP PGO Linker: инструмент размещения кода для процессоров Blackfin Sat, April 20 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

PGO Linker: инструмент размещения кода для процессоров Blackfin Печать
Добавил(а) microsin   

Процессоры Blackfin® предоставляют встроенную в кристалл память уровня 1 (L1), которая может быть сконфигурирована определенным образом для получения преимуществ, необходимых в удовлетворении особенностей реализации приложения (его нагрузочных характеристик). Память L1 может быть сконфигурирована как SRAM, или она может быть поделена в смесь SRAM и кэша. Память L1 SRAM улучшает быстродействие путем статической привязки наиболее часто выполняемых секцй кода и кода, критичного к реальному времени выполнения.

Чтобы достичь наилучшей производительности системы, разработчик приложения может утилизировать профиль выполнения приложения и базу знаний, чтобы вручную настроить конфигурацию привязки кода к памяти. Однако это слишком затратный по времени разработки подход для больших по размеру приложений.

Чтобы помочь автоматизировать этот утомительный процесс и уменьшить время разработки, был разработан инструмент, применяемый на времени линковки (profileguided optimization tool, PGO), PGO Linker. Он позволяет сгенерировать эффективную привязку кода к памяти L1 SRAM инструкций, используя профиль выполнения приложения и техники оптимизации программы [2]. В этом документе описано функциональное поведение PGO Linker, а также приемы его использования, выгоды по улучшению быстродействия, функции и ограничения (перевод даташита [1]).

[Для чего все это нужно]

На рис. 1 показана иерархия памяти процессора Blackfin. Память L1 может использоваться полностью как память SRAM, или может быть поделена между SRAM и памятью кэша.

EE 306 Blackfin memory hierarchy

Рис. 1. Иерархия памяти процессора Blackfin.

Примечание: показанная на рис. 1 внутренняя память L2 доступна только в двухядерных процессорах ADSP-BF561 Blackfin. Память L2 может быть сконфигурирована только как SRAM.

При доступе со стороны ядра ко всем адресам, которые не могут относиться к L1 SRAM, доступ перенаправляется на внешнюю память через узел управления обращениями к внешней памяти (External Bus Interface Unit, EBIU). В результате доступ переходит в домен тактовых частот системы (SCLK), который характеризуется замедлением доступа к памяти. Однако, когда используется память кэша L1, к внешней памяти физически осуществляется доступ только в случае промахов кэша, и только тогда время доступа увеличивается. Быстродействие можно дополнительно увеличить, если задействовать L1 SRAM. Код, привязанный к L1 SRAM, не является субъектом промахов кэша, так что при работе кода в этой памяти полностью устраняются доступы к внешней памяти, и гарантируется быстрый доступ в ответ на все запросы ядра. К сожалению, обычно не удается весь код привязать к L1 SRAM, поскольку у внутренней памяти весьма ограниченный объем.

Чтобы достичь самого лучшего быстродействия, к памяти L1 SRAM привязывают только критический ко времени выполнения код и код, который выполняется наиболее часто. Это будет гарантировать минимальные задержки на доступ для большинства случаев выполнения программы. Менее часто используемый код можно поместить во внешнюю память, к которой осуществляется прямой доступ со стороны ядра через кэш L1 (если использование кэша разрешено).

Инструмент PGO Linker автоматизирует процесс привязки наиболее часто выполняемого кода в память L1 SRAM. Используются техники оптимизации программы, чтобы сгенерировать наиболее эффективную карту памяти кода. Это устраняет необходимость ручной настройки конфигурации карты памяти, и экономит время разработчика, избавляя его от утомительных ручных изменений в исходном коде.

[Как работает PGO Linker]

На рис. 2 показаны шаги, которые выполняет PGO Linker.

EE 306 Functional Flow PGO Linker

Рис. 2. Поток функционального поведения PGO Linker.

Сначала PGO Linker захватывает функциональную символьную информацию и вывод данные профайлинга их среды разработки VisualDSP++® IDDE. Чтобы получить данные профайлинга, PGO Linker использует специальный механизм профилирования программы на базе типа запуска сессии.

Сессии эмулятора (JTAG) используют статистический профайлер, а сессии симулятора используют линейный профайлер. PGO Linker опции оптимизации командной строки (O1 и O2) указывают технику оптимизации, накладываемую на сборку, чтобы сгенерировать файл ассемблера *.asm.

Выходной файл .asm содержит сортированный список приоритета для всех функций в приложении. Как только этот файл подключен к проекту, линкер будет использовать список приоритетов функций, указанных в выходном (.asm) файле, и файл настроек линкера (.ldf), чтобы сгенерировать оптимальную карту памяти.

[Как использовать PGO Linker]

Утилита командной строки PGO Linker установлена в каталог VisualDSP++. Программа PGO Linker для своего запуска требует выполняемого файла процессора Blackfin (файл с расширением .dxe) и данные профайлинга - эта информация нужна для генерации карты памяти приложения.

Примечание: хороший вывод PGO Linker получится тогда, когда данные профайлинга собраны из VisualDSP++ IDDE.

Входные данные профайлинга должны быть независимы от начального размещения кода в памяти, осуществляемого линкером. По умолчанию линкер помещает функции в память в том порядке, в котором они перечислены в папке проекта. Функции, которые попались первыми, будут привязаны к памяти L1 SRAM, и все остальные функции (если они есть) в случае нехватки памяти L1 будут привязаны к более высоким уровням иерархии памяти (L2, L3).

Статистический профайлер (когда работает эмулятор JTAG) учитывает задержки доступа обращений к памяти, когда идет обращение к разным уровням иерархии памяти. Это подразумевает, что функции, которые попали во внешнюю память, получат больший процент занятого процессорного времени, чем те же самые функции, которые были бы помещены во встроенную в кристалл память L1 SRAM. Таким образом, чтобы уйти от любого смещения для функций, которые попал во внешнюю память, поместите весь код на один уровень иерархии памяти (лучше всего во внешнюю память, потому что объема L1 скорее всего не хватит, а L2 есть только в кристалле ADSP-BF561, и её объем также ограничен) с разрешенным кэшем. Это минимизирует задержки доступа к памяти для разных уровней иерархии памяти в данных профайлинга.

Чтобы полностью исключить задержки памяти и профайле выполнения, запустите PGO Linker в скомпилированной сессии симуляции (не в отладчике). В этом случае выполняется линейный профайлинг, который считает только инструкции; таким образом, не учитываются любые задержки доступа, зависящие от иерархии памяти.

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

Чтобы запустить PGO Linker:

1. Загрузите программу в VisualDSP++.
2. Выберите в меню Tools -> Profiler, чтобы открыть окно профайлера.
3. Запустите программу, чтобы сделать выборку входных данных.
4. Подождите, пока программа не остановится, либо остановите её вручную.
5. Откройте консоль комнадной строки (команда cmd операционной системы Windows).
6. Запустите на выполнение утилиту PGO Linker с подходящими аргументами командной строки (см. Листинг 1). Утилита сгенерирует .asm-файл.

После этого останется применить результаты работы PGO Linker:

7. Подключите сгенерированный файл .asm к проекту программы.
8. Пересоберите (Rebuild) проект.

Листинг 1. Пример командной строки PGO Linker.

PGOLinker < dxefile(.dxe) > < Output file (.asm) > -L1Min -L1Max -L1Step –algorithm
< dxefile(.dxe) > - Blackfin executable
< Output file(.asm) > - The file would contain all the linker directives for the
function symbols
Options
-------
-help: To display all options
-L1Min: Minimum size of L1 Instruction SRAM, default: 4KB
-L1Max: Maximum size of L1 Instruction SRAM, default: 80KB
-L1Step: Steps of increase in L1 SRAM, default: 4KB
-algorithm: O1 | O2

Сгенерированный утилитой PGO Linker файл .asm добавляется в проект. После перекомпиляции проекта линкер поместит функции в определенные области памяти, базируясь на приоритетах, назначенных в сгенерированном .asm файле. Улучшение быстродействия можно оценить с помощью специальных тестов (примеры тестирования см. в [2]).

Выходной файл с расширением .asm и используемая директива .priority в нем следует формату:

.extern function_symbol;
.priority function_symbol,
 
src_file_path, assigned_priority #;

Здесь:

.extern оповещает линкер, что function_symbol является символом, определенным где-то во внешних файлах кода.

function_symbol это декорированное (mangled, так называемый манглинг) имя функции. Линкер использует mangled имена функций для привязки объектного кода к памяти.

.priority это директива линкера, используемая для привязки функций на базе заданного уровня приоритета.

src_file_path используется для разрешения (resolve) статических (static) символов.

assigned_priority # положительное число, значение которого задает порядок привязки функций к памяти - чем больше число, тем выше приоритет, так что функция с более высоким приоритетом с большей вероятностью будет привязана к памяти L1.

Деманглинг (англ. demangle). В конструкциях компилятора термин name mangling (также называется name decoration, декорация имен) означает технику, используемую для урегулирования различных проблем, связанных с разрешением уникальных имен элементов программы на разных современных языках программирования. Элементами декорации часто могут быть префиксы (например в виде подчеркивания) и/или суффиксы, добавляемые к имени функции. Декорация имен предоставляет дополнительную информацию в имени функции, структуры, класса или другого типа данных в с целью передачи этой информации от компиляторов к линковщикам. Потребность в декорации имен возникает в том случае, когда нужно генерировать уникальные имена объектов программы для случаев, когда одно и то же имя идентификатора появляется в различных контекстах программы (т. е. в разных областях namespace, областях видимости. Обычно namespace определяется как область действия имени объекта, ограниченная модулем, классом, или явно указанной директивой namespace или фигурными скобками). Также декорация может потребоваться для разных вариантов перезагрузки функции (function overloading). Любой объект кода, который генерируется компилятором, обычно линкуется с другими объектами кода (также сгенерированных этим или иногда другим компилятором) по своему типу. Линковку делает специальная программа - linker, которая нуждается в полной информации по каждому элементу программы. Например, корректная ссылка на функцию нуждается не только в имени, но также и в количестве аргументов функции, её типах и т. д. Соответственно деманглинг соответствует обратному преобразованию по отношению к декорации имен (кое-что взято из английской Википедии).

Вот пример полученного выходного файла .asm:

.extern _foo;
.priority _foo,"..\..\src\", 900;
.extern _bar;
.priority _bar,"..\..\src\", 897;

В этом примере функция foo() имеет приоритет выше, чем функция bar().

Обрабатывая директивы .priority, связанные с символическими именами функций, линкер разместит функцию foo() в L1 перед размещением функции bar(), потому что приоритет 900 выше, чем 897.

В сгенерированном файле приоритеты функций назначаются с интервалом 3, предоставляя пользователю дополнительную возможность добавлять функции, базируясь на знании приложения. Также любое количество функций может можно можно добавить с приоритетом выше, чем у функции с самым высоким приоритетом. Подобным способом можно добавить функции, у которых приоритет ниже, чем у функции с самым низким приоритетом.

Обратите внимание, что директиву .priority можно также использовать без PGO Linker.

Основываясь на выходном файле, PGO Linker также предоставляет информацию, относящуюся к размеру L1 против процентного уровня времени выполнения, чтобы помочь оценить конфигурации и объем L1.

Темно-синий текст на рис. 3 показывает, когда должна использоваться утилита PGO Linker в типичном цикле разработки встраиваемой системы. Имейте в виду, что после всех изменений в исходном коде топология проекта должна быть регенерирована.

EE 306 when to use PGO Linker

Рис. 3. Когда надо использовать PGO Linker.

[Выгоды, возможности, ограничения и использование]

Улучшение быстродействия сильно зависит от характеристик приложения с точки зрения размера кода и количества функций. Эксперименты на основе набора бенчмарков [2] показывают улучшение 3 .. 32% в тактах ядра, если сравнивать с картой памяти, генерируемой линкером по умолчанию. В большинстве случаев алгоритм O2 предоставляет дополнительное улучшение 1 .. 5% в сравнении с алгоритмом O1. Тесты проводились с включенным кэшем 16K L1 SRAM.

Как общее правило: PGO Linker больше всего полезен для программ, у которых размер больше 150 килобайт и больше 200 функций.

Выгоды. В дополнение к ускорению программы, PGO Linker также:

• Уменьшает время разработки
• Выполняет размещение кода на базе функций без необходимости модифицировать исходный код
• Предоставляет широкий контроль над порядком размещения кода в памяти и уменьшает усилия в разработке, причем даже не надо модифицировать файл .ldf
• Использует 2 техники оптимизации для генерации эффективной карты памяти приложения

Возможности:

• Полностью автоматизированный инструмент - вмешательство пользователя не требуется
• Используется во всех сессиях VisualDSP++ (simulator, compiled simulator и emulator)
• Эффективен в реальном времени
• Вывод прозрачен для пользователя

Ограничения: 

• Зависит от типа профайлинга - если входные данные не репрезентативны, то результаты могут варьироваться для различных тестов. Этот феномен оказывает меньше влияния при профайлинге выполнения реального приложения.
• Оптимизация ограничена только генерацией карты памяти. Размещение данных все еще должно быть обработано разработчиком вручную.

Типичные сценарии использования:

• Приложения, большие по размеру, с большим количеством функций
• Оценка производительности готовых программ-бенчмарков
• Портирование старого, готового кода, когда у программиста минимальные знания о поведении портируемого приложения

[С чего начать]

Загрузите утилиту PGO Linker из связанного .zip-файла [6]. Поместите копию PGOLinker.exe в каталог инсталляции VisualDSP++ (по умолчанию):

Program Files\Analog Devices\VisualDSP++ 

Примечание: утилита PGO Linker работает для релизов VisualDSP++, начиная с версии 4.0 (обновлено в июле 2006 года).

C:\Program Files\visualdsp>PGOLinker.exe "C:\mpeg\ mpeg2dec\BF533\mp2decoddata2.dxe"
"mp2.asm"
The command line options are configured as follows:-
DSPExecutable-->C:\mpeg\mpeg2dec\BF533\mp2 decoddata2.dxe
Linker directive Map File --> mp2.asm
Minimum L1 size selected --> 4
Maximum L1 size selected --> 80
L1 memory incremented in steps of --> 4
Optimization switch --> -O2
Connecting to the IDDE and loading Program
Connection to the IDDE established
Obtaining function symbol information
Function symbol information obtained
Getting profile Information
Analyzing the profile information
Analysis Done
Total sample count collected is --> 12513
The total execution from L1 for 4KB of L1 is 97.9142%
Total functions in L1 17
The total execution from L1 for 8KB of L1 is 100%
Total functions in L1 30
---------------------------------------------
Ready to generate the asm file
Linker directive .asm file generated

[Ссылки]

1. PGO Linker - A Code Layout Tool for Blackfin Processors (EE-306) site:analog.com.
2. Оптимизация системы на процессоре Blackfin.
3. ADSP-BF533 Blackfin Processor Hardware Reference site:analog.com.
4. VisualDSP++ Linker and Utilities Manual site:analog.com.
5. Guide to Blackfin Processor LDF Files (EE-237) site:analog.com.
6. 160119EE-306.zip - примеры и документация.

 

Добавить комментарий


Защитный код
Обновить

Top of Page