Профилирование

Перед началом профилирования убедитесь, что частота DSP фиксирована, подробнее см. Изменение частоты DSP в Linux.

Профилирование DSP-кернелов

Данный раздел описывает введение в профилирование DSP-кернелов. Профилирование позволяет определить узкие места DSP-кернела и порядок вызова функций во время выполнения. Поддержка профилирования реализована на базе gprof (подробнее см. The GNU Profiler).

Профилирование состоит из следующих шагов:

  1. Компиляция и линковка DSP-кернела с опцией -pg:

    target_compile_options(<target_name> PRIVATE "-pg")
    target_link_options(<target_name> PRIVATE "-pg")
    
  2. Запуск DSP-кернела на отладочном модуле для создания файла профиля.

    В случае успешного выполнения DSP-кернела, в текущей директории появится файл профиля gmon-elcore<elnum>-<function_name>-<job_number>.out, где:

    • elnum — номер DSP, на котором выполнялась данная программа.

    • function_name — имя вызываемой функции (как правило, это _elcore_main_wrapper).

    • job_number — порядковый номер задания в рамках данной программы.

  3. Запуск утилиты 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