C++ 如何使用DSP在OMAP上加速代码?

C++ 如何使用DSP在OMAP上加速代码?,c++,c,embedded,signal-processing,omap,C++,C,Embedded,Signal Processing,Omap,我正在为OMAP3430开发一个视频编解码器。我已经有了用C++编写的代码,我尝试修改/移植它的某些部分来利用DSP(SDK(OMAP ZoOM34 30SDK),我有一个附加的DSP)。p> 我尝试移植一个小型for循环,它运行在非常少量的数据(约250字节)上,但在不同的数据上运行了大约200万次。但是CPU和DSP之间通信的过载远远大于增益(如果我有) 我假设这项任务很像在普通计算机中为GPU优化代码。我的问题是移植什么样的部件会有好处?GPU程序员如何处理这些任务 编辑: GPP应用程序

我正在为OMAP3430开发一个视频编解码器。我已经有了用C++编写的代码,我尝试修改/移植它的某些部分来利用DSP(SDK(OMAP ZoOM34 30SDK),我有一个附加的DSP)。p> 我尝试移植一个小型for循环,它运行在非常少量的数据(约250字节)上,但在不同的数据上运行了大约200万次。但是CPU和DSP之间通信的过载远远大于增益(如果我有)

我假设这项任务很像在普通计算机中为GPU优化代码。我的问题是移植什么样的部件会有好处?GPU程序员如何处理这些任务

编辑:
  • GPP应用程序分配大小为0x1000字节的缓冲区
  • GPP应用程序调用DSPProcessor_ReserveMemory为每个分配的缓冲区保留一个DSP虚拟地址空间,其大小比分配的缓冲区大4K,以实现自动页面对齐。总保留大小还必须沿4K页面边界对齐
  • GPP应用程序调用DSPProcessor_映射,将每个分配的缓冲区映射到上一步中保留的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 core有类似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库,我不知道它们的名字

    我不知道传输数据的时基是什么,但我知道SDK规格表上列出的TMS32064x有一个非常强大的DMA引擎。(我假设它是原版ZOOM OMAP34X MDK。上面说它有一个64xx。)我希望OMAP有一些simalar,充分利用它们。我建议在64xx的内部ram中设置“乒乓”缓冲区,并使用SDRAM作为共享内存,通过DMA处理传输。外部RAM将成为6xxx系列任何部件的瓶颈,因此请将所有可以锁定的内存都保留在内部内存中,以提高性能。通常,这些部件在处理器内核进入内部内存后,能够将8个32位字总线到处理器内核,但这取决于它允许您映射为直接访问ram的缓存级别。TI的成本敏感部件将“可映射内存”移动到比其他一些芯片更远的地方。此外,所有零件手册都可以从TI获得,并以PDF格式免费下载。他们甚至免费给我TMS320C6000 CPU和指令集手册以及许多其他书籍的硬拷贝

    就编程而言,您可能需要使用一些“处理器内部函数”或内联汇编来优化您正在进行的任何数学运算。对于64xx,如果可能,最好使用整数运算,因为它没有内置的浮点核心。(这些在67xx系列中)如果查看执行单元,您可以映射您的计算,从而使不同的部件以一个周期内可能发生的方式针对不同的操作,那么您将能够实现这些部件的最佳性能。指令集手册列出了每个执行单元执行的操作类型。如果你能将你的计算分解成一个双数据流集,并稍微放松循环,那么当完全优化开启时,编译器会对你“更好”。这是因为处理器分为左侧和右侧,两侧的执行单元几乎相同


    希望这有帮助。

    根据我所做的测量,CPU和DSP之间的一个消息传递周期大约需要160us。我不知道这是因为我使用的内核还是桥驱动程序;但是对于一个简单的b来说,这是一个很长的时间