c++ - 如何使用 DSP 加速 OMAP 上的代码?

标签 c++ c embedded signal-processing omap

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

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

我认为此任务很像为普通计算机中的 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 在处理完成时用消息通知 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/

相关文章:

c++ - 在 Linux 上编译 boost asio 时出现链接错误

在 C 中将 char * 转换为大写

从 char 数组转换为 16 位有符号整数和 32 位无符号整数

c - 是否有不支持可重入互斥锁或递归锁的平台?

c++ - 这个 C++ 模式的名称及其背后的原因是什么?

c++ - 在嵌入式系统上将数组排序函数从 C++ 移植到 C

c - 有没有办法从 `FILE*` 获取文件名?

linux - Linux 中的持久存储值处理

c++ - 我应该使用 Direct3D 还是仅使用 Windows GDI 来获得精美/高性能的 Win32 应用程序 UI?

c - Struct 内部指针数组的大小