Pull to refresh

Comments 26

Напоминает map and reduce в Hadoop. То что в проце ядро, то в Hadoop отдельная нода в кластере
#include <ti/omp/omp.h>

void vecsum (float * x, float * y, float * z, int N)
{
int i;

omp_set_num_threads(8);

#pragma omp parallel for
for (i=a; i<b; i++)
z[i] = x[i] + y[i];

}

Не ясно откуда в этом примере взялись переменные a и b и чему они равны.
Спасибо за комментарий. Это была ошибка, причем достаточно принципиальная. Недосмотрели. В этом примере a и b быть не должно. Исправил. Более сложно подкорректировать предыдущий пример, где a и b задаются, но не объявлены. Дело в том, что их нужно передавать в параллельный регион как частные переменные, а в данном разделе (директива parallel) про частные переменные речи еще не было, и не хотелось бы забегать вперед. Как выйти из этой ситуации, подумаю…

Спасибо за статью. Чем-то сильно напоминает CUDA программирование.

Спасибо за публикацию!!!
Я тоже занимаюсь программирование TMS320C6678. Было бы интересно познакомиться с примером применением OpenMP в конкретномм проекте, с описанием всех настроек и конфигурации проекта.
В целом библиотека очень хорошая, но… Для выполнения коротких вычислений не всегда оправдана, поскольку много процессорного времени уходит на подготовку для распараллеливания, так же тяжело обрабатываются многоуровневые вложенные циклы. И использование OpenMP для TMS320С6678 навязывает использование дополнительных библиотек таких как IPC, SYS/BIOS и т.д. что приводит к раздуванию размера прошивки. По-этому иногда выгодней использовать оптимизацию и особые процессорные вычислительные функции чем данную библиотеку.
Вы упомянули о курсах повышения квалификации «Многоядерные процессоры цифровой обработки сигналов C66x фирмы Texas Instruments». А есть возможность познакомиться с материалами данного курса?
И очень-очень интересует учебное пособие по многоядерным DSP-процессорам.
Подробнее о курсах повышения квалификации: . Мы проводим их периодически, в разных форматах, по разной цене, с разными акцентами. В этом году приглашаем преподавателя из UK. Естественно, материалы просто так не распространяем, приглашаем на курсы. Содержание курсов есть на сайте.
Подробнее о курсах повышения квалификации: www.dspa.ru/workshops/ws.php
Благодарю за информацию, буду упрашивать начальство о выделении денег )))
Преподаватель иностранец, а перевод его лекций будет?? Или как будет построено обучение?
По поводу затрат на OpenMP — да они существенны. Это отдельная тема отдельной статьи. Важно отметить, что OpenMP 2-ой версии от TI СУЩЕСТВЕННО лучше, чем OpenMP 1-ой версии за счет применения Multicore Navigatora и других приемов. Мы пытались распараллеливать КИХ-фильтр и другие типовые задачи ЦОС, но C66x — это машина, которая рассчитана не на такие примитивные вычисления, а на более серьезные задачи. А в более серьезных задачах уровень распараллеливания гораздо выше и затраты на OpenMP становятся оправданными. В целом, считаю данный путь перспективным.

Сам работаю с TMS320C6678. В проекте используются OpenMP, NDK, FFTlib с поддержкой OpenMP. Разговоры о применении стандарта параллельных вычислений это конечно хорошо. Но реальные проблемы поджидают при инициализации данного богатства. Поставить OpenMP 2.0 на устрой. Чтобы к этому добавить еще сетевой стек у меня ушло более двух недель. При этом стало намного удобнее работать в makefile, чем пытаться давить вредную и глючную CCSv6. Fftlib тоже то еще приключение. Она несет тонны зависимостей на framework components, но все модули из набора fc не содержат нужных функций ибо скомпилированы они без inline функций (директива компилятора без оптимизации). В общем примеры на каждую библиотеку простые и понятные. Но если нужно использовать несколько пакетов — можно вешаться. Инициализация и кормление зависимостей отнимает на порядки больше времени чем должно. Об этом было бы читать интереснее, так как проблема реальна, а в документации лишь мизерные крохи.

В общем примеры на каждую библиотеку простые и понятные. Но если нужно использовать несколько пакетов — можно вешаться. Инициализация и кормление зависимостей отнимает на порядки больше времени чем должно. Об этом было бы читать интереснее, так как проблема реальна, а в документации лишь мизерные крохи.

Полностью с Вами согласен в данном вопросе, отдельные душевные муки и пригорание к стулу вызывает работа с документацие TI. Когда начинаешь читать один документ, потом переходишь по ссылке в другой, потом в третий и так каскадом с зацикливанием. Последние мои мучения были с реализацией обмена данных с FPGA по протоколу SRIO. Документация только в виде справочных таблиц по регистрам, а как и что настраивать, в какой последовательности и т.д. вообще ничего нет, пришлось решать проблему долгими и мучительными ковыряниями в исходниках примеров и методом научного тыка.
Не знаю как вы, но я очень тоскую по старому CCS 3, стабильный, работающий и приятный в использовании продукт, а вот эта поделка СCS 4-7 на базе Eclipce вызывает нервное подергивание глаза.
Не знаю как вы, но я очень тоскую по старому CCS 3

Я начал работать на 5 версии, не могу сравнивать.

Самая интересная задумка в IDE: конфигурация проекта через графический интерфейс. Хочешь сеть: поставь галочку и сеть будет работать. Хочешь HTTP сервер, ставишь галочку и инициализация уже есть. Но к сожалению оно совсем не работает и я не знаю плат, на которых все без проблем запускается.

Работа напрямую с компилятором и линковщиком через makefile позволяет избегать большей части eclipse кошмара. Однако в отладке таких ошибок не избежать. ЕМНИП c 12 года ошибка при просмотре ресурсов платы (ROV), если не дай бог хоть одна секция памяти оказалась дальше 0x80000000. А это собственно начало DDR3 памяти и тот же OpenMP требует себе стека в DDR3.

Есть пакеты которые в принципе не работают, например ndk_2_21_01_38, но они все также доступны на сайте TI.

В общем контроллер вроде как хороший, RTOS sys/bios сносный, IDE отстой, документация отстой. Под ардуину в блокноте без intelsence писать и то приятнее.
Кстати тоже столкнулся с неработающим ndk, пробовал разные версии, но так и не запустил.
Работа напрямую с компилятором и линковщиком через makefile позволяет избегать большей части eclipse кошмара.
Можно подробней о таком методе разработки?
Все выглядит достаточно просто если вы занимались компилированием через makefile (у меня опыт небольшой). В первую очередь ссылка на немного документации. Примеры того как должна выглядеть компиляция вне CCS можно посмотреть здесь. Собственно отталкиваясь от одного из таких примеров я колхозил свой проект.

Документация на компилятор cl6x в данном руководстве пользователя, а также в сопутствующих документах.

Процесс построения приложения выглядит следующим образом:
  • Специальный инструмент xdc парсит *.cfg файл и тянет зависимости которые нужны.
  • Компилятор компилирует и запускает линковщик.
  • Линковщик подтягивает из библиотек/исходников участки кода (как минимум одна библиотека используется всегда libc.a).
  • PROFIT

Выгода в данном подходе состоит в том, что можно работать полностью во внешнем редакторе (ужасно бесит как CCS пытается сверстать (секунд 5-6) вебстраничку для *.cfg, но не справляется).
В случае подтягивания библиотек вся работа происходит в достаточно неудобном многоуровневом графическом интерфейсе (медленно).
CCS долгое переключение модулей RTOS + тупая ошибка, когда CCS не видит переименованный каталог среди модулей.

Насчет NDK: для него необходимо проинициализировать ряд других подсистем. Среди них есть QMSS, которая также используется в OpenMP, SRIO(?) и пути инициализации у них разные. Можно посмотреть мой рабочий черновик; вероятно данный пример не получится скомпилировать ибо приходилось перекомпилировать исходники + FFTlib не работает, но как пример с удолетворенными зависимостями посмотреть можно.
Благодарю, буду иметь ввиду ваш метод )))

Было бы интересно почитать про обмен с плис. Каких скоростей удалось достич? Почему srio а не e-pci?

У нас есть плата своей разработки, где FPGA Kintex 7 подключена к dsp tms320c6678 по интерфейсу SRIO.
Мы использовали передачу данных из ПЛИС в DDR память DSP на скорости 5 Gbps с конфигурацией линий srio «one 4x port»
Для начинающих работу с OpenMP написано хорошо и доступно. Тем не менее, есть несколько замечаний и пожеланий.
1. Поскольку речь идет о программе повышения квалификации, то участвовать в ней могут люди с разным background. Например, я довольно много использовал OpenMP для задач обработки изображений на PC и немного программировал одноядерные DSP. У меня возникло довольно много вопросов.
a) Мне было бы интересно понять особенности OpenMP на TMS320C66x по сравнению с реализации OpenMP в компиляторах Intel и Microsoft для PC. Есть ли отличия и в чем?
b) Сила DSP в SIMD инструкциях. Видимо в статье предполагается, что SIMD-векторизация появляется в результате работы компилятора. Однако бывают задачи, когда авто-векторизация компилятором работает недостаточно хорошо и приходится писать intrinsics и/или встроенный ассемблер. Как такой подход сочетается с OpenMP, нет ли особенностей и ограничений?
c) При использовании С++ нет необходимости явно указывать private для переменных объявленных внутри параллельной секции. Все остальные переменные автоматически shared, если не указано иное в #pragma. Для TMS320C66x также?
2. Ошибка с sum, которую Вы приводите в статье, является типичным примером ошибки типа «гонки данных» (race conditions). Новички часто делают подобные ошибки, а обнаружить их бывает не просто. Хорошо бы заострить на этом внимание. Когда я показывал студентам такого рода ошибки в их коде, у большинства тутже возникал соблазн все переменные объявлять shared. Почему так не стоит делать лучше показать на замерах времени работы. Вообще, мне кажется, что графики со временем работы для разных примеров сделали бы статью гораздо лучше.
3. В тексте говорится про «версии OpenMP разработанные TI». Не понял, как это соотносится с версиями стандарта OpenMP? Кстати, если я ничего не путаю, сейчас есть 4-я версия стандарта.
4. Совершенно правильно отмечено, что не стоит распаралеливать «короткие» циклы, так как есть накладные расходы на создание потоков. Где и как искать оптимум? Обещана отдельная статья. OK. Буду ждать.
5. Если честно, то я не увидел ориентации примеров на задачи ЦОС. Размер кода линейного КИХ фильтра (свертка) не сильно отличается от скалярного произведения. Вообще, такой процессор очень хорош для обработки изображений и видео.
Версия стандарта OpenMP — это версия набора имеющихся API и их общая идеология. Как эти API и идеологию реализовать на конкретной аппаратной платформе — проблема разработчиков платформы, в данном случае TI. Поэтому есть версия спецификации OpenMP и версия реализации спецификации. На данный момент TI выпустила версию 2.2 спецификации OMP 3.0.

По поводу графиков времени — спасибо.

Директивы OpenMP желательно использовать, скажем так, на уровень выше по отношению к оптимизируемым структурам. Тогда компилятор формирует эффективный код внутри параллельного региона, а OpenMP добавляет снаружи свои издержки на распараллеливание. Но возможны и сложности. Например, столкнулись с тем, что директива atomic не дает выигрыша по сравнению c critical как раз по этой причине: директива OpenMP внутри цикла делает невозможной оптимизацию этого цикла.

Примеры, ориентированы на ЦОС. Здесь подразумевается сравнение с теми примерами, которые содержатся в документации на OpenMP. Там примеры часто замысловатые и неудобные.

Еще хочу отметить, что курсы повышения квалификации предназначены для программистов DSP, которые хотят познакомиться с новыми инструментальными средствами. То есть основной упор на DSP, а не на OpenMP.

За комментарии — спасибо!
UFO just landed and posted this here
Для отладки мы покупали вот такие платы.
http://www2.advantech.com/Support/TI-EVM/6678le_of.aspx
UFO just landed and posted this here
Да, извиняюсь.
https://www.einfo.ru/store/TMS320C6678/
http://ru.farnell.com/texas-instruments/tmdsevm6678l/tms320c6678-enet-uart-eval-module/dp/2113704
http://allchip.ru/2715447/TMDXEVM6678L.html
Покупка это отдельная песня… смотря в какой конторе вы работаете и есть ли необходимость покупать через реестр добросовестных поставщиков
UFO just landed and posted this here
Да, извиняюсь.
https://www.einfo.ru/store/TMS320C6678/
http://ru.farnell.com/texas-instruments/tmdsevm6678l/tms320c6678-enet-uart-eval-module/dp/2113704
http://allchip.ru/2715447/TMDXEVM6678L.html
Покупка это отдельная песня… смотря в какой конторе вы работаете и есть ли необходимость покупать через реестр добросовестных поставщиков
После полутора курсов с ассемблером TMS320VC5402 хочется плакать кровавыми слезами зависти от программирования DSP на C++ в статье
Sign up to leave a comment.

Articles

Change theme settings