Використання DSP-співпроцесора DM8168 з допомогою фреймворку C6Accel



У цій статті ми познайомимося з налагоджувальною платою DM816x/C6A816x/AM389x і фреймворком C6Accel (він же C6EZAccel), а також розглянемо інструкції з налагодження системи для виконання вбудованих тестових додатків.

Все почалося з цікавої ідеї використовувати алгоритми нині дуже популярною бібліотеки комп'ютерного зору OpenCV на мікропроцесорі. Однак, вивчивши трохи тему, ідея уточнилася. Чому б не реалізувати алгоритми не просто на ядрі ARM, а на спеціалізованому ядрі для цифрової обробки сигналів DSP? Тим самим розвантажимо ядро ARМ, прискоримо виконання алгоритмів, і, можливо, саме громіздке додаток запрацює в реальному часі.

Отже, що ж використовувати для вирішення задачі? Виявилося варіантів небагато…

Розглянемо все логічно і послідовно. Почнемо з того, що дозволяє працювати з DSP процесором — це фреймворк C6Accel. Добре, він підтримує OpenCV (причому 2.x) тільки в останній версії — 2.01.00.11. У свою чергу, цей фреймворк написаний під мікропроцесори C6A81xx/DM81xx. По назві статті ви вже здогадалися, що нам попався під руку DM8168, для роботи з яким потрібен інтерфейс TI EZSDK (остання версія — 5.05.02.00).

Для тих, кому хочеться подробиць, в кінці статті є корисні посилання.

1. Опис налагоджувальної плати DM816x/C6A816x/AM389x





Обчислювальний модуль DM816x/C6A816x/AM389x, розроблений компанією Texas Instruments спільно з Spectrum Digital, дозволяє проводити розробку на DM816x DaVinci™ MPU (DM8168, DM8167, DM8166, DM8165), на C6A816x C6-Integra™ DSP+ARM процесорах (C6A8168, C6A8167) і на AM389x Sitara™ ARM MPUs (AM3894, AM3892).

Це диво техніки призначене для широкого спектру рішень, таких як відеореєстратори (DVRs) для спостереження, системи організації відеоконференцій, системи телевізійного мовлення, медиасерверы, одноплатні комп'ютери, обчислювальні шлюзові машини, маршрутизатори, сервери, промислова автоматика, інтерфейси «користувач-машина» (HMIs), термінали пунктів обслуговування для збору даних, машинне зір, програми для тестування, вимірювання, спостереження, контролю та ін



Тепер подивимося на сам об'єкт. Він складається з двох блоків друкованих плат:
  • обчислювальний модуль 8168 (зверху);
  • дочірня плата розширення входів-виходів (знизу).
Зважаючи на велику кількість компонентів звернемо свою увагу тільки на особливо важливі.



На малюнку вище зображено обчислювальний модуль 8168 з наступними означеними компонентами:
1. і 2. — це перемикачі №3 (SW3) і №4 (SW4) відповідно.



Стандартно завантаження плати відбувається з флеш-пам'яті NAND (проте існує багато інших режимів, наприклад, завантаження з SD-карти), тому перемикачі №3 і №4 були встановлені в потрібне положення: SW3[9:0]=«0000010010» і SW4[1:0]=«10» [NAND/SPI].

3. Послідовний порт (COM-порт).
4. Порт HDMI.
5. Порт Ethernet.
6. Порт USB.
7. Компонентний відео.
8. Слот для SD-карти.
9. Гніздо живлення.
10. Перемикач живлення.
11. Мікропроцесор DM8168 (емулює AM3894 і C6A816).

Функціональна діаграма:



Характерні особливості:
    •  VLIW-процесор C674x DSP (до 1 ГГц, тип команд — з фіксованою та плаваючою точкою).
    •  RISC-процесор ARM Cortex-A8 (1.2 ГГц).
    •  Укоритель 3D-графіки SGX530.
    •  Підсистема обробки відео високої чіткості (HDVPSS).
    •  3 програмованих співпроцесора обробки відео високої чіткості (HDVICP2), що відповідають за захоплення, кодування, декодування та аналіз декількох відеопотоків, а також підтримують стандарти H. 264, MPEG4,H263, VC1/RTV, AVS, RV10, ON2, JPEG, MPEG2, DIVX.
    •  Широкий набір периферійних модулів:
        — 2 каналу Gigabit Ethernet;
        — 2 канала PCI Express;
        — 2 каналу SATA з інтегрованим фізичним рівнем;
        — 2 каналу USB 2.0 з інтегрованим фізичним рівнем;
        — інтерфейси DDR3, MMC/SD, HDMI і DVI.

Для подальшої роботи ми підключалися до компонентів 3, 5, 9 і налаштовували перемикачі 1, 2, 10.

2. Опис фреймворку C6Accel

C6Accel — абсолютно безкоштовний інструмент для розробки ПЗ від Texas Instruments (TI). Він призначений для спрощення розробки коду DSP на двоядерних гетерогенних процесорів SoC від TI, а саме для пристроїв на ARM+DSP, які запускають Linux на ARM і містять процесор DSP з сімейства C6000.

2.1. З чого складається C6Accel?
C6EZAccel складається з алгоритмів цифрової обробки сигналів, які дотримуються інтерфейсу алгоритмів під назвою XDAIS (eXpressDsp Algorithm Interoperability Standard). TI також надає фреймворк під назвою Codec Engine, який дозволяє ефективно виконувати алгоритми, написані з використанням інтерфейсу XDAIS. TI постачає всі свої кодеки в рамках ПЗ для SoC і рекомендує використання Codec Engine. C6EZAccel також складається з бібліотеки на стороні ARM, яка є надбудовою над Codec Engine, який надає APIs (інтерфейси програмування додатків). А вони, в свою чергу, дозволяють кодом програми на стороні ARM викликати виконання алгоритмів XDAIS на DSP. Ця бібліотека містить у собі управління кешем, перетворення адрес, передачу параметрів і обробку помилок з додатка, що працює на ARM.

2.2. Як працює C6Accel?
Код ARM-додатки (або проміжне ПО, яка його використовує) викликає C6Accel. Він використовує оболонку бібліотеки APIs та/або Codec Engine, сумісний c iUniversal APIs, які, як і VISA APIs, що використовуються для виклику Audio/Video/Speech-кодеків. Потім ці APIs переглядають інтерфейс Codec Engine і викликають алгоритм C6Accel на DSP, який ідентифікує виклик функції і задіє відповідну функціональність на DSP, використовуючи параметри, передані з програми.



3. Використання EZSDK і C6Accel

Досить теорії, приступимо до практики. EZSDK 5.05.02.00 підтримується тільки в Ubuntu 10.04 LTS 32-bit або Ubuntu 11.10 32-bit. Тому тим, у кого не встановлена одна з цих ОС (звичайно ж, ми працювали під більш новою версією), доведеться використовувати віртуальну машину, наприклад, VirtualBox. Інструкції по її установці і настройці є тут.

Далі використовуються наступні позначення:
  • host $ — команда для виконання на хості;
  • target # — команда для виконання цільової ОС.
3.1. Установка і збірка EZSDK
Перед початком роботи з EZSDK слід завантажити і встановити компілятор З CodeSourcery Toolchain 2009q-203. Просто розпакуйте архів в домашню директорію.

Скачайте EZSDK 5.05.02.00:
host $ sudo ./ezsdk_dm816x-evm_5_05_02_00_setuplinux

Запуститься інсталятор. Вкажіть розташування CodeSourcery Toolchain, т. е. /home/%username%/arm-2009q1/bin, і шлях для установки EZSDK — /home/%username%/ezsdk.

Розробники цього подбали про нас і зробили інтерактивний скрипт (одна з причин суворої прив'язки до версії OC):
host $ export EZSDK="${HOME}/ezsdk"
host $ sudo ${EZSDK}/setup.sh

Скрипт встановить необхідні пакети і попросить уточнити:
  • шлях встановлення цільової файлової системи /home/%username%/targetfs;
  • шлях кореневої директорії tftp — /tftpboot;
  • шлях послідовного порту — /dev/ttyUSB0 (для підключення по USB-порту) або /dev/ttyS0 (для підключення до COM-порту);
  • ip-адреса хост-машини — у кожного свій (наприклад, у нас 10.54.4.44);
  • розташування ядра Linux — 1-е із запропонованого списку, тобто TFTP;
  • розташування кореневої файлової системи — 1-е із запропонованого списку, тобто NFS;
  • ім'я образу ядра, що завантажується з TFTP — uImage-dm816x-evm.bin;
  • створювати скрипт для minicom — погодьтеся;
  • запускати зараз створений скрипт — відмовтеся.
Скоригуємо цей скрипт: відкриємо його у текстовому редакторі і замінимо текст «mem=364M@0x80000000 mem=320M@0x9FC00000» на «mem=364M», так як в подальшому буде неможливо завантажити необхідні модулі ядра.

Далі, для виконання яких-небудь операцій на платі потрібно запустити minicom з параметрами, зазначеними в скрипті, командою
host $ minicom-S setup_uimage-tftp_fs-nfs.minicom

Далі потрібно перезапустити плату.

Тепер при складанні EZSDK виникає проблема через відсутність деякого компонента. Можна полагодити, розпакувавши архів 8272.pcie.tar.gz в директорію /home/%username%/ezsdk/example-applications.

Нарешті зберемо EZSDK командами
host $ cd ${HOME}/ezsdk
host $ sudo make all
host $ sudo make install

3.2. Установка і збірка С6Accel
Скачайте C6Accel 2.01.00.11:
host $ sudo ./c6accel_2_01_00_11_Linux-x86_Setup.bin

Вкажіть шлях установки /home/%username%/c6accel.

Операційна система реального часу SYS/BIOS є складовою частиною EZSDK, проте версії пізніше 6.32.02.09 не підтримують Real Time Data eXchange (RTDX), який необхідний при складанні С6Accel. Тому встановимо SYS/BIOS 6.32.02.09 спеціально для С6Accel:
host $ sudo ./bios_setuplinux_6_32_02_39.bin

Вкажіть шлях установки /home/%username%/c6accel/bios_6_32_02_39.

Виправимо шляху у файлі Rules.make в /home/%username%/c6accel на наступні:
DVSDK_INSTALL_DIR=$(HOME)/ezsdk
TARGETFS_INSTALL_DIR = $(HOME)/targetfs
C6ACCEL_INSTALL_DIR=$(HOME)/c6accel
BIOS_INSTALL_DIR = $(HOME)/c6accel/bios_6_32_02_39
DSPDEVKIT_INSTALL_DIR= $(DVSDK_INSTALL_DIR)/dsp-devkit
LINUXDEVKIT_INSTALL_DIR = $(DVSDK_INSTALL_DIR)/linux-devkit
PLATFORM = dm816x-evm

І, врешті-решт, зберемо С6Accel командами:
host $ cd ${HOME}/c6accel
host $ sudo make all
host $ sudo make install

3.3. Виконання тесту DSP
Приємно, що C6Accel містить у собі приклад для тестування виконання коду на DSP-процесор. Виконаємо скрипт завантаження модулів cmem і dsplink (це бібліотеки зв'язки ARM і DSP, з допомогою яких вантажиться CodecEngine) і запустимо тестуючі додаток.
target # cd /opt/c6accel_app/c6accel_dsplib_testapp
target # ./loadmodules_ti8168_c6accel.sh
target # ./c6accel_dsplib_testapp

Ура! За повідомленнями в консолі видно, що все гаразд і нічого не зламано******************************************************************************
Sample application for testing kernels in C6Accel started.
******************************************************************************
CERuntime complete
C6Accel handle created

Test for Vision/Analytics functions in C6Accel:


Testing the function: VLIB_histogram_1D_дU8…
VLIB_histogram_1D_U8 passed the test!

Testing the function: VLIB_histogram_1D_U16…
VLIB_histogram_1D_U16 passed the test!

Testing the function: VLIB_histogram_nD_U16…
VLIB_histogram_nD_U16 passed the test!

Testing the function: VLIB_weightedHistogram_1D_U8…
VLIB_weightedHistogram_1D_U8 passed the test!

Testing the function: VLIB_weightedHistogram_nD_U16…
VLIB_weightedHistogram_nD_U16 the test failed!
VLIB_unpackMask32 passed the test!
VLIB_packMask32 passed the test!
VLIB_subtractBackGroundS16 passed the test!
VLIB_subtractBackGroundS32 passed the test!

Testing the function: VLIB_extractLumaFromUYUV…
C6accel test for VLIB_extractLumaFromUYUV passed the test!

Testing the function: VLIB_convertUYVYsemipl_to_YUVpl…
VLIB_convertUYVYsemipl_to_YUVpl passed the test!

Testing the function: VLIB_convertUYVYpl_to_YUVint…
VLIB_convertUYVYpl_to_YUVint passed the test!

Testing the function: VLIB_convertUYVYint_to_YUVpl…
VLIB_convertUYVYint_to_YUVpl passed the test!

Testing the function: VLIB_convertUYVYint_to_RGBpl…
VLIB_convertUYVYint_to_RGBpl passed the test!

Testing the function: VLIB_ConvertUYVYint_to_YUV420pl…
VLIB_ConvertUYVYint_to_YUV420pl passed the test!

Testing the function: VLIB_convertUYVYint_to_LABpl…
VLIB_convertUYVYint_to_LABpl passed the test!

Testing the function: VLIB_convertUYVYint_to_HSLpl…
VLIB_convertUYVYint_to_HSLpl passed the test!

Testing the function: VLIB_convertUYVYint_to_LABpl_LUT…

Completed initialization.
VLIB_convertUYVYint_to_LABpl2 passed the test!
Testing VLIB_harrisScore_7x7…
VLIB_harrisScore_7x7 passed the test!

Initializing Legendre Поліноміальні

Computing Legendre Moments

Testing the function: VLIB_legendreMoments…
VLIB_legendreMoments passed the test!

Testing the function: VLIB_normalFlow_16…
VLIB_normalFlow_16 passed the test!

Testing the function: VLIB_kalmanFilter_4x6 functions…
VLIB_kalmanFilter_ VLIB_recursiveFilterHoriz1stOrders16…
VLIB_recursiveFilterHoriz1stOrders16 passed the test!

Testing VLIB_recursiveFilterVert1stOrядра.der…
VLIB_recursiveFilterVert1stOrder passed the test!

Testing VLIB_recursiveFilterVert1stOrders16…
VLIB_recursiveFilterVert1stOrders16 passed the test!

Testing the function: VLIB_bhattacharyaDistance_U32…
VLIB_bhattacharyaDistance_U32 passed the test!

Testing the function: VLIB_L1DistanceS16…
VLIB_L1DistanceS16 functions passed the test
VLIB_dilate_bin_mask passed the test!
VLIB_dilate_bin_square passed the test!
VLIB_dilate_bin_cross passed the test!
VLIB_erode_bin_mask passed the test!
VLIB_erode_bin_square passed the test!
VLIB_erode_bin_cross passed the test!
Testing VLIB_trackFeaturesLucasKanade_7x7…
VLIB_trackFeaturesLucasKanade_7x7 passed the test!
VLIB Canny functions Test results:
IMG_conv_7x7: passed the test!
VLIB_xyGradient: passed the test!
VLIB_nonMaximumSuppressionCanny: passed the test!
VLIB_doublethresholding: passed the test!
VLIB_edgeRelaxation: passed the test!

Calling Прикутий Canny API:
Прикутий Canny edge detection function failed the test!

Testing the function: VLIB_integralImage8…
VLIB_integralImage8 passed the test!

Testing the function: VLIB_integralImage16…
VLIB_integralImage16 passed the test!

Testing the function: VLIB_imagePyramid8…
VLIB_imagePyramid8 passed the test!

Testing the function: VLIB_imagePyramid16…
VLIB_imagePyramid16 passed the test!

Testing the function: VLIB_gauss5x5PyramidKernel_8…
VLIB_gauss5x5PyramidKernel_8 passed the test!

Testing the function: VLIB_gauss5x5PyramidKernel_16…
VLIB_gauss5x5PyramidKernel_16 passed the test!

Testing the function: VLIB_gradientH5x5PyramidKernel_8…
VLIB_gradientH5x5PyramidKernel_8 passed the test!

Testing the function: VLIB_gradientV5x5PyramidKernel_8…
VLIB_gradientV5x5PyramidKernel_8 passed the test!

VLIB_initMeanWithLumaS16 passed the test!
VLIB_updateEWRMeanS16 passed the test!
VLIB_initMeanWithLumaS32 passed the test!
VLIB_updateEWRMeanS32 passed the test!
VLIB_initVarWithConstS32 passed the test!
VLIB_updateEWRVarianceS32 passed the test!
VLIB_initVarWithConstS16 passed the test!
VLIB_updateEWRVarianceS16 passed the test!
VLIB_updateUWRMeanS16 passed the test!
VLIB_updateUWRVarianceS16 passed the test!

Test for Image processing functions in C6Accel:

Tests for Histogram functions successful
Test for Median Filtering functions successful
Tests for Convolution functions successful
Tests for Correlation functions successful
Tests for Sobel Filter successful
Test for Image multiplication functions successful
Tests for Image addition functions successful
Tests for Image substraction functions successful
Tests for Color Space Conversion functions successful
C6accel_IMG_ycbcr422pl_to_ycbcr422sp() successful
C6accel_IMG_ycbcr422sp_to_ycbcr422ile() successful
C6accel_IMG_ycbcr422sp_to_ycbcr420pl successful

Test for Fixed point Signal processing functions in C6Accel

Tests for FFT functions successful
Tests for Invers FFT functions successful
Test for Auto Correlation function successful
Tests for DoT Product functions successful
Tests for Matrix multiplication successful
Tests for FIR Filtering functions successful
Test for IIR Filter successful

Test for Fixed point Math functions in C6Accel

Test for Arithmetic RTS functions successful
Tests for Conversion RTS functions successful
Tests for IQmath Conversion functions successful
Tests for Mathematical IQmath functions successful
Tests for Arithmetic IQmath functions successful
Tests for Trignometric IQmath functions successful

Test for Floating point Math Functions in C6Accel

Test for Arithmetic RTS functions successful
Tests for Conversion RTS functions successful
Tests for Floating point RTS single precision functions successful
Tests for Floating point RTS double precision functions successful

Test for Floating point Signal processing Functions in C6accel

Test for Floating point DSP FFT function successful
Test for Floating point DSP vector multiplication successful
Test for Floating point DSP vector reciprocal function successful
Test for Floating point DSP vector reciprocal function successful
Test for Floating point DSP vector weighted function sum successful
Test for Floating point DSP vector dot product function executed successful
Tests for Floating point DSP matrix functions successful
Tests for Floating point DSP Matrix Multiplication functions successful
Test for Floating point DSP matrix transpose function successful
Tests for Floating point DSP autocorrelation functions successful
Tests for Floating point DSP convolution functions successful
Test for Floating point DSP FIR filter successful
Test for Floating point DSP Inverse FFT function successful
Test for Floating point DSP BIQUAD Filter successful
Test for Floating point to Double precision successful
Test for Complex to real and imaginary passed successfully
-> Asynchronous Calls
Tests for FFT functions successful
Tests for Sobel Filter successful
Test for Arithmetic RTS functions successful
******************************************************************************
All tests done.
******************************************************************************


4. Тест порівняння функцій OpenCV на ARM і DSP

OpenCV (Open Source Computer Vision Library) — бібліотека алгоритмів комп'ютерного зору, обробки зображень і чисельних алгоритмів загального призначення з відкритим вихідним ко-будинок. Бібліотека написана на C і C++, проте підтримується Java, Python та ін Працює під Linux, Windows і Mac OS X.

OpenCV являє собою просту у використанні бібліотеку комп'ютерного зору з більш ніж 500-ми функцій, здатними працювати в реальному часі. Вони охоплюють багато областей, такі як контроль якості на виробництві, системи безпеки, обробку зображень в медицині, користувацькі інтерфейси, стереоскопічний зір і роботобудування.

Так як бібліотека OpenCV є портативним, її можна скомпілювати в більшості систем, в яких передбачено компілятор C/C++. OpenCV успішно використовується на ARM, MIPS, Xscale та інших процесорах.

Варто зауважити, що в C6Accel 2.01.00.11 є не всі функції OpenCV, а лише 50.

4.1. Установка і збірка OpenCV
Дотримуйтесь інструкцій для складання OpenCV 2.2.0 під ARM-платформу. При їх виконанні пам'ятайте, що CodeSourcery Toolchain вже встановлений.

Скопіюємо колективні бібліотеки OpenCV в цільову файлову систему.
host $ cp ${HOME}/build/lib/* ${HOME}/targetfs/usr/lib

4.2. Складання і виконання тесту
Перша проблема, з якою довелося зіткнутися, — це помилка при завантаженні зображень. Чомусь не подобаються картинки з розширенням png, помилка локалізована в функції cvCreateImage. Гаразд, змінимо на інше розширення, наприклад, bmp. Це можна зробити так:
host $ cd ${HOME}/c6accel/soc/app/c6accel_opencv_testapp/opencv_images
host $ for fname in *.png; do convert "$fname" "$fname.bmp"; done

І звичайно, не забудемо змінити розширення у вихідному коді. У файлах appMain.c і c6accel_opencv_testfxns.c розташованих в директорії /home/%username%/c6accel/soc/app/c6accel_opencv_testapp замінимо всі рядки «.png» на «.png.bmp», для цієї мети зручний текстовий редактор gedit з комбінацією клавіш Ctrl+H.

Другою проблемою виявилися помилка при виконанні функції C6Accel_test_Matchshapes і відмова роботи функції cvFindCornerSubPix (у зв'язку з відомим багом http://code.opencv.org/issues/963).

У файлі appMain.c закомментіруем рядок з функцією C6Accel_test_Matchshapes. А у файлі c6accel_opencv_testfxns.c закомментіруем текст з рядка
//cvFindCorner SubPix issue to be resolved 
і включно до рядка
printf("Called ARM FindCornerSubPix function (time: %f ms)\n", t_algo / 1000.0 / n);

Наостанок зберемо і запустимо тестове додаток.
host $ cd ${HOME}/c6accel
host $ sudo make opencv_app
host $ sudo make opencv_app_install
target # cd /opt/c6accel_app/c6accel_opencv_testapp
target # ./loadmodules_ti8168_c6accel.sh
target # ./c6accel_opencv_testapp

Ура! Після довгих мук все запрацювало.

Результат роботи програми підсумовано в таблиці




















































Функція OpenCV 
Середній час
виконання
на ARM, мс

Середній час
виконання
на DSP, мс

Відмітка про
виборі
DSP

Різниця між результатами виконання
на ARM і DSP (відстань в просторі
L2, якщо не зазначено інше)

cvCanny
43.218000
42.804000
+
0.000000
get Афінна transform matrix
0.557000
0.411000
+
0.000000
Афінна transform
46.325000
36.554000
+
7926.342031
2D Rotation Matrix
0.314000
0.378000
-
0.000000
Rotation using Афінна
55.380000
40.985000
+
774.451419
cvIntegral
6.537000
8.232000
-
0.000000
cvMinMaxLoc
3.083000
1.660000
+
Результати співпадають
cvNorm
1.881000
1.336000
+
0.000000
AddS
9.573000
12.434000
-
0.000000
AbsDiff
9.036000
14.349000
-
0.000000
AbsDiffS
10.555000
12.670000
-
0.000000
Add
8.931000
15.852000
-
0.000000
cvDilate
3.182000
1.282000
+
0.000000
cvErode
3.093000
1.281000
+
0.000000
cvLaplace
180.171000
11.968000
+
0.000000
cvPyrDown
4.265000
4.917000
-
0.000000
cvFilter2D
519.593000
21.259000
+
3651.030129
cvFindContours
11.915000
17.753000
-
Результати співпадають
EqualizeHist
5.809000
8.921000
-
0.000000
SetZero
0.634000
3.871000
-
132898.252336
Rectangle
5.847000
1.307000
+
Circle
3.652000
3.323000
+
Flip
12.372000
12.071000
+
0.000000
Copy
2.479000
6.072000
-
Sobel
5.463000
7.197000
-
0.000000
ConvertScale
5.139000
6.044000
-
Adaptive threshold
89.986000
33.231000
+
0.000000
cvMulSpectrums
91.865000
15.221000
+
0.086427
cvDFT
597.131000
99.666000
+
cvNormalize
57.318000
13.576000
+
cvSmooth
109.345000
57.467000
+
1771.619316
HoughLines2D
2314.028000
634.262000
+
46306.904723
cvCornerHarris
653.550000
168.213000
+
0.136828
cvCornerEigenValsAndVecs
3430.892000
870.525000
+
350.751214
cvCornerMinEigenVal
1384.182000
1.155000
+
cvMulSpectrums
91.711000
15.323000
+
0.086427
cvDFT
597.707000
99.412000
+
cvNormalize
58.782000
13.751000
+
GoodFeaturesToTrack
1259.277000
279.508000
+
FindCornerSubPix
449.029000
 
cvMatchTemplate
1576.569000
221.753000
+
3.741657
cvThreshold
2.182000
4.442000
-
0.000000
cvBoundingRect
0.036000
0.302000
-
Різниця між отриманими площами — 0.000000
cvDrawContour
0.030000
0.989000
-
cvContourArea
0.049000
0.231000
-
Plotting
183.243000
 
CvtColor
16.283000
13.804000
+
0.000000
Resize
18.357000
17.617000
+
cvCalcOpticalFlowPyrLK
2472.993000
146.874000
+
Обидва результату складаються з 445 особливостей
HaarDetectObjects
2522.499000
460.350000
+
Обидва результату складаються з 5-ти елементів.
ARM:
  0:   46,   48 (42x42)
  1:  174,   48 (37x37)
  2:  240,   51 (38x38)
  3:  110,   48 (40x40)
  4:   92,   37 (131x131)
DSP:
  0:   47,   49 (40x40)
  1:  175,   49 (35x35)
  2:  240,   52 (37x37)
  3:   17,  198 (34x34)
  4:  110,   48 (38x38)

За результатами можна зробити висновки:
  • У деяких функцій є різниця між результатами виконання. Архітектура сигнальних процесорів, порівняно з мікропроцесорами загального застосування, має деякі особливості, пов'язані з прагненням максимально прискорити виконання типових задач ЦОС. DSP орієнтовані, в першу чергу, на багаторазове виконання множення з розрахунком «на льоту» адрес помножуються елементів масивів. Алгоритм, реалізований на різних базових операціях, може давати різні результати.
  • Не всі функції працюють швидше на DSP, ніж на ARM. Можна помітити закономірність: це функції базових операції над матрицями або функції, які в основному з них складаються. Такі «погані» функції можна виконувати на ARM, в той час як інші пере-нести на DSP. У разі перевантаження процесора ARM використання деяких «поганих» функцій на DSP може бути терпимим.
  • При використанні «хороших» функції на DSP можна досягти поліпшення в рази і навіть більше, ніж на порядок. Це, як правило, найбільш трудомісткі функції.
Таким чином, балансуючи між швидкодією, завантаженням процесорів і результатами виконання можна істотно оптимізувати роботу програми.

Корисні посилання:
  1. Плата DM816x/C6A816x/AM389x
  2. Завантаження DM816x
  3. Керівництво користувача EZSDK
  4. Фреймворк C6Accel
  5. Гарна книга по OpenCV + частковий переклад на російську
  6. Стаття про застосування OpenCV на процесорах ARM і DSP


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.