Примеры использования

Архив buildroot/dl/dsp-elcore50-libraries.tar.gz содержит пакет автоматизированных тестов (подготовка тестовых данных, запуск, сравнение результатов) для всех библиотек. Пакет состоит из тестов на базе pytest (исполняется на CPU) и тестовых кернелов для DSP.

Примеры и тесты, распространяемые в составе архива, предназначены для запуска на модуле с предварительно прошитыми образами по инструкции главы Дистрибутив Buildroot MCom-03 Linux SDK.

Предсобранные тесты предназначены для запуска с использованием утилиты elcorecl-run.

В главе Запуск тестов приведена инструкция по запуску всех тестов.

В главах dsplib, matrix-lib и signal-lib приведены инструкции с ручным запуском отдельных тестов из пакета.

Запуск тестов

  1. Открыть терминал на хосте, к которому подключено целевое устройство. Подключиться через UART и выполнить команду:

    minicom -D /dev/ttyUSBX
    # здесь X - номер USB устройства
    
  2. Загрузить Linux на целевом устройстве.

  3. Создать виртуальное окружение и установить в него зависимости:

    # Загрузить uv
    wget \
      https://github.com/astral-sh/uv/releases/download/0.5.4/uv-aarch64-unknown-linux-gnu.tar.gz \
      --no-check-certificate --no-verbose
    tar --strip-components=1 -xzf uv-aarch64-unknown-linux-gnu.tar.gz
    # Создать виртуальное окружение
    ./uv --no-cache venv
    # Установить зависимости
    ./uv --no-cache pip install --no-progress \
      -r /usr/share/elcore50/libraries/tests/requirements.txt
    
  4. Запустить тесты:

    # Определить путь, куда будут сохранены артефакты тестов
    tests_artifacts_path=<path>
    # Запустить тесты
    .venv/bin/pytest /usr/share/elcore50/libraries/tests \
      --artifacts-path=$tests_artifacts_path \
      --html=$tests_artifacts_path/report.html --self-contained-html \
      --junitxml=$tests_artifacts_path/report.xml
    

При успешном выполнении тестов в директории tests_artifacts_path будут сохранены csv-таблицы с замерами времени выполнения БПФ и одномерной БПФ-свертки библиотеки elcore50-signal-lib. Также по результатам тестов БПФ будут построены графики производительности и сохранены в elcore50_fft_performance.png. Для библиотек dsplib и matrix-lib артефакты не генерируются.

Возможен запуск тестов библиотек через pytest по отдельности. Для этого при запуске теста необходимо указать путь до требуемого теста:

.venv/bin/pytest tests/dsplib/test_dsplib.py \
  --artifacts-path=$tests_artifacts_path \
  --html=$tests_artifacts_path/report.html --self-contained-html \
  --junitxml=$tests_artifacts_path/report.xml

dsplib

Пример запуска теста вычисления суммы векторов:

elcorecl-run -e /usr/share/elcore50/libraries/tests/dsplib/elf/test_add.elf

В случае успешного завершения программы в консоли будет следующая таблица:

 func name | element count | ref tic | opt tic | TI tic | byte/tic opt | byte/tic TI | status |
-----------------------------------------------------------------------------------------------
 add_short |           512 |     344 |     307 |    214 |         6.67 |        9.57 | passed |
 add_short |          1024 |     483 |     305 |    406 |        13.43 |       10.09 | passed |
 add_short |          2048 |     810 |     365 |    790 |        22.44 |       10.37 | passed |
 add_short |          8192 |    2474 |     603 |   3094 |        54.34 |       10.59 | passed |
 add_short |         16384 |    4702 |     987 |   6166 |        66.40 |       10.63 | passed |
 add_int   |           512 |     677 |     305 |    406 |        13.43 |       10.09 | passed |
 add_int   |          1024 |     850 |     336 |    790 |        24.38 |       10.37 | passed |
 add_int   |          2048 |    1320 |     429 |   1558 |        38.19 |       10.52 | passed |
 add_int   |          8192 |    4704 |     987 |   6166 |        66.40 |       10.63 | passed |
 add_int   |         16384 |    9161 |    1757 |  12310 |        74.60 |       10.65 | passed |
 add_fl    |           512 |     642 |     304 |      - |        13.47 |           - | passed |
 add_fl    |          1024 |     807 |     329 |      - |        24.90 |           - | passed |
 add_fl    |          2048 |    1338 |     496 |      - |        33.03 |           - | passed |
 add_fl    |          8192 |    4934 |     983 |      - |        66.67 |           - | passed |
 add_fl    |         16384 |    9720 |    1752 |      - |        74.81 |           - | passed |
 add_db    |           512 |     875 |     328 |      - |        24.98 |           - | passed |
 add_db    |          1024 |    1467 |     421 |      - |        38.92 |           - | passed |
 add_db    |          2048 |    2487 |     505 |      - |        64.89 |           - | passed |
 add_db    |          8192 |    9591 |    1658 |      - |        79.05 |           - | passed |
 add_db    |         16384 |   19227 |    3196 |      - |        82.02 |           - | passed |

Результаты в тактах могут отличаться. Здесь столбец ref tic показывает время в тактах, затраченное на выполнение данной операции референсной функцией на C, opt tic — оптимизированной версии, TI tic — аналогичной операции в библиотеке DSPLIB для С66x от Texas Instruments, столбец byte/tic opt показывает скорость оптимизированной версии в байтах/такт, byte/tic TI — скорость операции в библиотеке DSPLIB для С66x.

matrix-lib

Пример запуска теста вычисления произведения матриц типа float32:

elcorecl-run -e /usr/share/elcore50/libraries/tests/matrix-lib/elf/test_mat_mul_fl32.elf

В случае успешного завершения программы в консоли будет следующая таблица:

| func_name     | size (r0, c1r1, c1) | ref mul/tic | opt mul/tic | status |
----------------------------------------------------------------------------
| mat_mul_fl32  |       4     4   128 |       1.070 |       0.457 | passed |
| mat_mul_fl32  |     512   512   512 |      14.089 |      81.044 | passed |
| mat_mul_fl32  |     256   256   256 |      14.149 |      81.985 | passed |
| mat_mul_fl32  |     512   256   256 |      14.158 |      86.949 | passed |
| mat_mul_fl32  |     512   512   256 |      12.909 |      79.893 | passed |
| mat_mul_fl32  |     512   512   128 |      12.575 |      38.419 | passed |
| mat_mul_fl32  |     512  1024   256 |       9.095 |      76.991 | passed |
| mat_mul_fl32  |      49  2048   512 |       7.830 |      64.857 | passed |
| mat_mul_fl32  |   12544    16    96 |       7.466 |      42.901 | passed |
| mat_mul_fl32  |    3136    24   144 |       4.348 |      47.200 | passed |
| mat_mul_fl32  |     784   192    32 |       1.268 |      52.182 | passed |
| mat_mul_fl32  |     784    32   192 |       7.541 |      45.906 | passed |
| mat_mul_fl32  |     196   384    64 |       4.561 |      42.908 | passed |
| mat_mul_fl32  |     196    64   384 |      11.732 |      58.924 | passed |
| mat_mul_fl32  |      49   160   960 |      10.985 |      57.315 | passed |
| mat_mul_fl32  |      49   960   160 |       7.975 |      56.079 | passed |
----------------------------------------------------------------------------

Результаты в тактах могут отличаться. Здесь столбец ref mul/tic показывает отношение количества умножений к затраченному времени в тактах референсной функции на C, opt mul/tic — оптимизированной версии.

signal-lib

В составе архива для библиотеки существуют:

  • /usr/share/elcore50/libraries/tests/signal-lib — полные тесты библиотеки.

  • /usr/share/elcore50/libraries/tests/signal-lib-examples — упрощенные примеры для вычисления БПФ.

Пример запуска на плате примера вычисления одномерного БПФ для типа float16:

elcorecl-run -e /usr/share/elcore50/libraries/tests/signal-lib/elf/sample-fft-float16-1d.elf

В случае успешного завершения программы вывод будет следующим:

float16 1d sample result:
fft_size = 262144, passed!

Сборка тестов из исходного кода

Указать путь до директории aarch64-buildroot-linux-gnu_sdk-buildroot:

export AARCH64_BUILDROOT_SDK=<путь/до/aarch64-buildroot-linux-gnu_sdk-buildroot>

В директории с исходным кодом тестов выполнить:

export ELCORE50_LIBRARIES_CMAKE_PATH= \
  $AARCH64_BUILDROOT_SDK/aarch64-buildroot-linux-gnu/sysroot/usr/share/elcore50/libraries/lib/cmake

cmake -B build \
  -DCMAKE_TOOLCHAIN_FILE=$AARCH64_BUILDROOT_SDK/opt/toolchain-elcore50/share/cmake/elcore50-toolchain.cmake \
  -DELCORE50_CL_BUILD=ON \
  -DELCORE50_TARGET=MCom03 \
  -DElcoreRuntime_DIR=$AARCH64_BUILDROOT_SDK/aarch64-buildroot-linux-gnu/sysroot/usr/lib/cmake/ElcoreRuntime \
  -Delcore50-dsplib_DIR=$ELCORE50_LIBRARIES_CMAKE_PATH/elcore50-dsplib \
  -Delcore50-matrix-lib_DIR=$ELCORE50_LIBRARIES_CMAKE_PATH/elcore50-matrix-lib \
  -Delcore50-signal-lib_DIR=$ELCORE50_LIBRARIES_CMAKE_PATH/elcore50-signal-lib

cmake --build build