Профилирование
Перед началом профилирования убедитесь, что частота DSP фиксирована, подробнее см. Изменение частоты DSP в Linux.
Профилирование DSP-кернелов
Данный раздел описывает введение в профилирование DSP-кернелов. Профилирование позволяет определить узкие места DSP-кернела и порядок вызова функций во время выполнения. Поддержка профилирования реализована на базе gprof (подробнее см. The GNU Profiler).
Профилирование состоит из следующих шагов:
Компиляция и линковка DSP-кернела с опцией
-pg
:target_compile_options(<target_name> PRIVATE "-pg") target_link_options(<target_name> PRIVATE "-pg")
Запуск DSP-кернела на отладочном модуле для создания файла профиля.
В случае успешного выполнения DSP-кернела, в текущей директории появится файл профиля
gmon-elcore<elnum>-<function_name>-<job_number>.out
, где:elnum
— номер DSP, на котором выполнялась данная программа.function_name
— имя вызываемой функции (как правило, это_elcore_main_wrapper
).job_number
— порядковый номер задания в рамках данной программы.
Запуск утилиты elcore32-elvees-elf-gprof для анализа данных профиля.
Утилита elcore32-elvees-elf-gprof собирается в рамках пакета binutils-elcore50 и доступна на отладочном модуле по имени.
Пример вызова утилиты elcore32-elvees-elf-gprof:
elcore32-elvees-elf-gprof <ELF-file> <gmon-file>
Особенности профилирования программ
При добавлении опции «-pg» компилятор вставляет дополнительный код, который сэмплирует программу сохраняет дампы профиля. Включение/отключение сэмплирования реализовано через системные вызовы: через равные промежутки времени, определяемые периодом сэмплирования, считывается и анализируется регистр PC DSP. По умолчанию период сэмплирования равен 10 мс. Когда время выполнения программы соизмеримо с периодом сэмплирования или меньше, с целью повышения качества профилирования, рекомендуется уменьшить период сэмплирования или зациклить выполнение программы.
Однако уменьшение периода сэмплирования может приводить к нестабильной работе системного таймера. В этом случае, после успешного выполнения программы будет выведено сообщение о количестве потерянных сэмплов. Например:
355 profiler samples lost!
Если количество потерянных сэмплов достаточно велико относительно общего времени выполнения программы, то результаты профилирования будут искажены.
Изменение периода сэмплирования осуществляется через Параметры модуля ядра. Например, для изменения периода профилирования с 10 мс до 1 мс необходимо выполнить:
modprobe -r elcore50
modprobe elcore50 timer_period=1000
Профилирование драйвера elcore50
Данный раздел описывает утилиты для профилирования драйвера elcore50. Профилирование драйвера выполняется с целью определения накладных расходов, связанных с запуском и выполнением DSP-кернелов.
Результатом профилирования драйвера являются:
Общее время выполнения заданий, время работы DSP;
Доля драйвера elcore50 в общем времени выполнения задания;
Накладные расходы, связанные с обработкой прерываний;
Накладные расходы, связанные с обработкой системных вызовов DSP;
Накладные расходы на создание и освобождение буферов;
Накладные расходы на создание MMU-таблиц для буферов;
Профилирование драйвера elcore50 в Linux основано на ftrace и выполняется с использованием утилит elcore-prof.py и ftrace-parser.
elcore-prof.py
Утилита elcore-prof.py запускает переданную команду и сохраняет ftrace-лог для последующего использования утилитой ftrace-parser.
$ elcore-prof.py --help
usage: elcore-prof.py [options] cmd <command>
Ftrace based elcore50 driver profiler.
optional arguments:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
Write profiling results to file. Default: stdout
-d DEPTH, --depth DEPTH
The max tracing depth. Default: 0
--trace-functions TRACE_FUNCTIONS
Comma separated list of tracing functions by function tracer. Functions of elcore50
driver are enabled by default
--notrace-functions NOTRACE_FUNCTIONS
Comma separated list of non-tracing functions
For assigning format of functions for '--trace-functions' and '--notrace-functions' options
see 'set_ftrace_filter' and 'set_ftrace_notrace' in the ftrace documentation:
https://www.kernel.org/doc/html/v4.19/trace/ftrace.html
The list of all available functions:
cat /sys/kernel/debug/tracing/available_filter_functions
Examples:
elcore-prof.py -o /tmp/xyram.ftrace \
cmd elcorecl-run -e /usr/share/elcore50-extra/test-xyram
elcore-prof.py \
--trace-functions=qlic_handle_irq,swiotlb_sync_single_for_cpu,swiotlb_sync_single_for_device\
-o /tmp/xyram.ftrace \
cmd elcorecl-run -e /usr/share/elcore50-extra/test-xyram
ftrace-parser
Утилита ftrace-parser разбирает лог, возвращаемый утилитой elcore-prof.py.
$ ftrace-parser --help
usage: ftrace-parser [options] ifile
Parse ftrace log returned by elcore-prof.py
positional arguments:
ifile Source file with ftrace log
optional arguments:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
Write profiling results to file. Default: stdout
Example:
ftrace-parser -o /tmp/result /tmp/xyram.ftrace