Я работаю над видеокодеком для OMAP3430. У меня уже есть код, написанный на C ++, и я пытаюсь изменить / портировать некоторые его части, чтобы воспользоваться преимуществами DSP (SDK (OMAP ZOOM3430 SDK), который у меня есть, имеет дополнительный DSP).
Я попытался перенести небольшой цикл for, который обрабатывает очень небольшой объем данных (~ 250 байт), но примерно 2 миллиона раз для разных данных. Но перегрузка от связи между процессором и DSP намного больше, чем выигрыш (если он у меня есть).
Я предполагаю, что эта задача очень похожа на оптимизацию кода для графического процессора в обычных компьютерах. У меня вопрос, портирование каких частей было бы выгодно? Как программисты на GPU решают такие задачи?
редактировать:
- Приложение GPP выделяет буфер размером 0x1000 байт.
- Приложение GPP вызывает DSPProcessor_ReserveMemory, чтобы зарезервировать виртуальное адресное пространство DSP для каждого выделенного буфера, используя размер на 4 КБ больше, чем выделенный буфер, для учета автоматического выравнивания страниц. Общий размер резервирования также должен быть выровнен по границе страницы размером 4 КБ.
- Приложение GPP вызывает DSPProcessor_Map для отображения каждого выделенного буфера в виртуальные адресные пространства DSP, зарезервированные на предыдущем шаге.
- Приложение GPP подготавливает сообщение для уведомления фазы выполнения DSP о базовом адресе виртуального адресного пространства, которое было сопоставлено с буфером, выделенным на GPP. Приложение GPP использует DSPNode_PutMessage для отправки сообщения в DSP.
- GPP вызывает memcpy для копирования обрабатываемых данных в общую память.
- Приложение GPP вызывает DSPProcessor_FlushMemory, чтобы убедиться, что кэш данных был очищен.
- Приложение GPP подготавливает сообщение для уведомления фазы выполнения DSP о том, что запись в буфер завершена, и теперь DSP может получить доступ к буферу. Сообщение также содержит количество данных, записанных в буфер, чтобы DSP знал, сколько данных нужно скопировать. GPP использует DSPNode_PutMessage для отправки сообщения DSP, а затем вызывает DSPNode_GetMessage, чтобы дождаться ответа от DSP.
После этого начинается выполнение программы DSP, и DSP уведомляет GPP сообщением о завершении обработки. Чтобы попробовать, я не вкладываю никакой обработки в программу DSP. Я просто отправляю сообщение "обработка завершена" обратно в GPP. И на это по-прежнему уходит много времени. Может ли это быть из-за использования внутренней / внешней памяти или просто из-за перегрузки связи?