我正在为OMAP3430开发视频编解码器。我已经有用C++编写的代码,并且我尝试修改/移植其中的某些部分以利用DSP(SDK(OMAP ZOOM3430 SDK)我有一个附加的DSP)。

我试图移植一个小的for循环,该循环正在运行非常少量的数据(〜250字节),但是对不同的数据大约运行了200万次。但是,CPU和DSP之间通信的过载远远超过了增益(如果有的话)。

我认为该任务很像为普通计算机中的GPU优化代码。我的问题是移植哪种零件将是有益的? GPU程序员如何处理此类任务?

编辑:

  • GPP应用程序分配大小为0x1000字节的缓冲区。
  • GPP应用程序调用DSPProcessor_ReserveMemory,以使用比分配的缓冲区大4K的大小为每个分配的缓冲区保留DSP虚拟地址空间,以实现自动页面对齐。总预留大小也必须沿4K页面边界对齐。
  • 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。而且这仍然要花费很多时间。可能是由于内部/外部内存使用情况,还是仅由于通信过载?

    最佳答案

    OMAP3430没有板载DSP,它具有连接到系统总线的IVA2 +视频/音频解码引擎,而Cortex内核具有类似DSP的SIMD指令。 OMAP3430上的GPU是基于PowerVR SGX的单元。虽然它确实具有可编程的着色器,但我认为通用编程ala CUDA或OpenCL没有任何支持。我可能是错的,但我从未听说过这样的支持

    如果您使用板载的IVA2 +编码/解码引擎,则需要为此设备使用适当的库,并且它仅支持我所知道的特定编解码器。您是否正在尝试向该模块编写自己的库?

    如果您使用的是Cortex的内置DSPish(SIMD指令),请发布一些代码。

    如果您的开发板上有一些额外的DSP,那么什么是DSP?如何将其连接到OMAP?

    至于台式机GPU问题,在视频解码的情况下,您可以使用供应商提供的函数库来调用硬件,其中有几个,Linux上的Nvidia的VDAPU,Windows上的类似的库(我认为称为PureViewHD)。 ATI的板载解码引擎也有linux和Windows库,我不知道名字。

    关于c++ - 如何使用DSP加速OMAP上的代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1044313/

    10-12 21:28