Как использовать DSP для ускорения кода на OMAP?

Я работаю над видеокодеком для OMAP3430. У меня уже есть код, написанный на C ++, и я пытаюсь изменить / портировать некоторые его части, чтобы воспользоваться преимуществами DSP (SDK (OMAP ZOOM3430 SDK), который у меня есть, имеет дополнительный DSP).

Я попытался перенести небольшой цикл for, который обрабатывает очень небольшой объем данных (~ 250 байт), но примерно 2 миллиона раз для разных данных. Но перегрузка от связи между процессором и DSP намного больше, чем выигрыш (если он у меня есть).

Я предполагаю, что эта задача очень похожа на оптимизацию кода для графического процессора в обычных компьютерах. У меня вопрос, портирование каких частей было бы выгодно? Как программисты на GPU решают такие задачи?

редактировать:

  1. Приложение GPP выделяет буфер размером 0x1000 байт.
  2. Приложение GPP вызывает DSPProcessor_ReserveMemory, чтобы зарезервировать виртуальное адресное пространство DSP для каждого выделенного буфера, используя размер на 4 КБ больше, чем выделенный буфер, для учета автоматического выравнивания страниц. Общий размер резервирования также должен быть выровнен по границе страницы размером 4 КБ.
  3. Приложение GPP вызывает DSPProcessor_Map для отображения каждого выделенного буфера в виртуальные адресные пространства DSP, зарезервированные на предыдущем шаге.
  4. Приложение GPP подготавливает сообщение для уведомления фазы выполнения DSP о базовом адресе виртуального адресного пространства, которое было сопоставлено с буфером, выделенным на GPP. Приложение GPP использует DSPNode_PutMessage для отправки сообщения в DSP.
  5. GPP вызывает memcpy для копирования обрабатываемых данных в общую память.
  6. Приложение GPP вызывает DSPProcessor_FlushMemory, чтобы убедиться, что кэш данных был очищен.
  7. Приложение GPP подготавливает сообщение для уведомления фазы выполнения DSP о том, что запись в буфер завершена, и теперь DSP может получить доступ к буферу. Сообщение также содержит количество данных, записанных в буфер, чтобы DSP знал, сколько данных нужно скопировать. GPP использует DSPNode_PutMessage для отправки сообщения DSP, а затем вызывает DSPNode_GetMessage, чтобы дождаться ответа от DSP.

После этого начинается выполнение программы DSP, и DSP уведомляет GPP сообщением о завершении обработки. Чтобы попробовать, я не вкладываю никакой обработки в программу DSP. Я просто отправляю сообщение "обработка завершена" обратно в GPP. И на это по-прежнему уходит много времени. Может ли это быть из-за использования внутренней / внешней памяти или просто из-за перегрузки связи?


person Can Bal    schedule 25.06.2009    source источник
comment
Я обычно использовал цепочку инструментов TI Code Composer при работе с серией C6xxx, поэтому я не могу сказать вам конкретные вызовы Linux, которые нужно использовать, но оборудование C64xx в любом случае примерно такое же. По возможности вам следует избегать необходимости удержания рук при копировании данных. Я ожидал, что memcpy свяжет процессор в цикле копирования, если возможно, найти операцию DMA от ARM для перемещения данных. Попробуйте выполнить любую возможную обработку, пока операции DMA выполняются параллельно. В худшем случае вы сможете сконфигурировать C64xx для перемещения данных, напрямую запрограммировав регистры DMA.   -  person NoMoreZealots    schedule 29.06.2009
comment
Посмотрите документацию к плате, я не могу найти слишком много информации о ней, потому что они продвигают следующее поколение набора Zoom, операции DMA смогут передавать данные на Buswidth * Clockspeed для синхронных шин. Если для выполняемой вами обработки не требуется вложенный цикл, то для его перемещения по внешней шине может потребоваться больше времени, чем для локальной обработки. Частота внешних шин обычно составляет 1/2 или 1/4 от частоты ядра для деталей в диапазоне 400 МГц. Если это асинхронная шина, то еще хуже.   -  person NoMoreZealots    schedule 29.06.2009
comment
ЕСЛИ скорость шины составляет 100 МГц (чтобы быть консервативной), а размер слова - 32 бита (C64xx может иметь 64-битную шину на EMIF для стандартных компонентов. На OMAP IDK?), То (4096 байтов / 4 байта) / 100 МГц = 10,24 мкс передачи время должно быть достижимо для этого количества данных с использованием DMA.   -  person NoMoreZealots    schedule 29.06.2009


Ответы (3)


OMAP3430 не имеет встроенного DSP, у него есть механизм декодирования видео / аудио IVA2 +, подключенный к системной шине, а ядро ​​Cortex имеет инструкции SIMD, подобные DSP. Графический процессор на OMAP3430 - это блок на базе PowerVR SGX. Хотя у него есть программируемые шейдеры, и я не верю, что есть какая-либо поддержка для программирования общего назначения, например, CUDA или OpenCL. Могу ошибаться но никогда не слышал о такой поддержке

Если вы используете встроенный механизм кодирования / декодирования IVA2 +, вам необходимо использовать соответствующие библиотеки для этого устройства, и он поддерживает только определенные кодеки из известных мне. Вы пытаетесь написать для этого модуля свою библиотеку?

Если вы используете встроенный в Cortex DSPish (инструкции SIMD), опубликуйте код.

Если на вашей плате разработчика есть дополнительный DSP, что такое DSP и как он подключен к OMAP?

Что касается вопроса о графическом процессоре рабочего стола, в случае декодирования видео вы используете библиотеки функций, предоставленные поставщиком, для выполнения вызовов на оборудование, есть несколько, VDAPU для Nvidia на Linux, похожие библиотеки на окнах (PureViewHD, я думаю, это называется). ATI также имеет библиотеки как для Linux, так и для Windows для своих встроенных механизмов декодирования, я не знаю названий.

person Mark    schedule 25.06.2009
comment
Я всегда слышал, что OMAP3 имеет встроенный DSP C64 + в дополнение к ARM Cortex A8. en.wikipedia.org/wiki/Texas_Instruments_OMAP#OMAP3 - person KeyserSoze; 25.06.2009
comment
Это зависит от конкретной модели. Те, которые используются в плате Beagle Board и в портативном устройстве Pandora, имеют C64xx, а многие другие - нет. - person NoMoreZealots; 25.06.2009
comment
Я нигде в спецификации не вижу DPS как часть процессора OMAP, интересно, что в вики-записи не упоминается модуль IVA2 +, это может быть основано на TI DSP focus.ti.com/general/docs/wtbu/ - person Mark; 25.06.2009
comment
OMAP3530 имеет встроенный 64xx. focus.ti.com/dsp/ docs / dspcontent.tsp? contentId = 53403 Деталь на его плате не имеет встроенного модуля, это внешний процессор на плате. - person NoMoreZealots; 25.06.2009
comment
Да, я использую плату ZOOM от LogicPD, и в ней есть DSP TMS32064x. - person Can Bal; 26.06.2009

Я не знаю, в какой временной базе вы передаете данные, но я знаю, что TMS32064x, который указан в спецификации для SDK, имеет очень мощный механизм DMA. (Я предполагаю, что это оригинальный ZOOM OMAP34X MDK. В нем говорится, что у него 64xx.) Я надеюсь, что у OMAP есть что-то похожее, используйте их в полной мере. Я бы порекомендовал установить буферы для пинг-понга во внутренней оперативной памяти 64xx и использовать SDRAM в качестве разделяемой памяти с дескриптором передачи по DMA. Внешняя оперативная память будет узким местом для любой из частей серии 6xxx, поэтому сохраняйте все, что можно, во внутренней памяти для повышения производительности. Обычно эти части будут иметь возможность передавать 8 32-битных слов в ядро ​​процессора, когда оно находится во внутренней памяти, но это зависит от части к части в зависимости от того, какой уровень кеш-памяти он позволяет отображать как оперативную память прямого доступа. Чувствительные к стоимости компоненты от TI перемещают «отображаемую память» дальше, чем некоторые другие микросхемы. Также все руководства к деталям доступны в TI для бесплатного скачивания в формате PDF. Они даже дали мне бесплатно печатные копии руководства по процессору и набору инструкций TMS320C6000 и многих других книг.

Что касается программирования, вам может потребоваться использовать некоторые из «встроенных функций процессора» или встроенную сборку для оптимизации любых вычислений, которые вы выполняете. Для 64xx по возможности отдайте предпочтение целочисленным операциям, потому что у него нет встроенного ядра с плавающей запятой. (Они относятся к серии 67xx.) Если взглянуть на блоки возбуждения, и вы сможете сопоставить свои расчеты таким образом, чтобы разные части нацелены на разные операции таким образом, который может происходить в одном цикле, тогда вы сможете достичь наилучшей производительности. этих частей. В руководстве по набору команд перечислены типы операций, выполняемых каждым исполнительным устройством. Если вы можете разбить свои вычисления на наборы с двумя потоками данных и немного размотать циклы, компилятор будет «лучше» для вас, когда включена полная оптимизация. Это связано с тем, что процессор разделен на левую и правую части с почти идентичными исполнительными блоками с обеих сторон.

Надеюсь это поможет.

person NoMoreZealots    schedule 25.06.2009
comment
Я не уверен, использую ли я внешнюю память или внутреннюю. В программе (MPU) я вызываю malloc, а затем сопоставляю эту выделенную память с общей памятью с помощью DSP. Я следил за образцом приложения, написанным TI. Подробности изложу ниже. - person Can Bal; 26.06.2009

Судя по измерениям, которые я провел, один цикл обмена сообщениями между ЦП и DSP занимает около 160 мкс. Я не знаю, связано ли это с используемым мной ядром или с драйвером моста; но это очень долго для простого обмена сообщениями.

Кажется, что портировать алгоритм на DSP имеет смысл только в том случае, если общая вычислительная нагрузка сравнима со временем, необходимым для обмена сообщениями; и подходит ли алгоритм для одновременных вычислений на CPU и DSP.

person Can Bal    schedule 14.07.2009
comment
Игнорируйте сообщения. Просто соберите все маленькие DSP-задания, которые вы хотите запустить, в буфере разделяемой памяти на стороне GPP, и как только вы их все соберете, вызовите DSP один раз, и пусть он выполнит свою работу. Вы также можете переместить весь свой видеодекодер на сторону DSP. - person Nils Pipenbrinck; 10.11.2009