Как использовать DSP для ускорения кода на OMAP? - PullRequest
6 голосов
/ 25 июня 2009

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

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

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

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

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

2 голосов
/ 25 июня 2009

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

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

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

2 голосов
/ 25 июня 2009

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

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

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

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

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

0 голосов
/ 14 июля 2009

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

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

...