Вопрос

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

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

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

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

  1. Приложение GPP выделяет буфер размером 0x1000 байт.
  2. Приложение GPP вызывает DSPProcessor_ReserveMemory, чтобы зарезервировать виртуальное адресное пространство DSP для каждого выделенного буфера, используя размер, который на 4K больше, чем выделенный буфер, для учета автоматического выравнивания страниц.Общий размер резервирования также должен быть выровнен по границе страницы размером 4K.
  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.И это по-прежнему отнимает много времени.Может ли это быть из-за использования внутренней / внешней памяти, или это просто из-за перегрузки связи?

Это было полезно?

Решение 3

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

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

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top