6

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

我尝试移植一个小的 for 循环,它在非常少量的数据(~250 字节)上运行,但在不同的数据上运行大约 2M 次。但是 CPU 和 DSP 之间通信的过载远远超过增益(如果我有的话)。

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

编辑:

  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完成处理时,DSP用消息通知GPP。只是为了尝试,我没有在 DSP 程序中进行任何处理。我只是将“处理完成”消息发送回 GPP。而这仍然会消耗大量时间。这可能是因为内部/外部内存使用,还是仅仅是因为通信过载?

4

3 回答 3

2

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 库,我不知道名称。

于 2009-06-25T16:03:28.047 回答
2

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

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

希望这可以帮助。

于 2009-06-25T16:47:18.837 回答
-1

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

如果总计算负载与消息传递所需的时间相当,那么将算法移植到 DSP 似乎是合理的;该算法是否适合在 CPU 和 DSP 上同时计算。

于 2009-07-14T10:36:33.410 回答