我正在为 OMAP3430 开发视频编解码器。我已经有用 C++ 编写的代码,我尝试修改/移植其中的某些部分以利用 DSP(我有一个额外的 DSP 的 SDK(OMAP ZOOM3430 SDK))。
我尝试移植一个小的 for 循环,它在非常少量的数据(~250 字节)上运行,但在不同的数据上运行大约 2M 次。但是 CPU 和 DSP 之间通信的过载远远超过增益(如果我有的话)。
我认为这项任务很像优化普通计算机中 GPU 的代码。我的问题是移植什么样的零件会有好处?GPU 程序员如何处理这些任务?
编辑:
- GPP 应用程序分配大小为 0x1000 字节的缓冲区。
- GPP 应用程序调用 DSPProcessor_ReserveMemory 为每个分配的缓冲区保留一个 DSP 虚拟地址空间,使用比分配的缓冲区大 4K 的大小来考虑自动页面对齐。总预留大小还必须沿 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完成处理时,DSP用消息通知GPP。只是为了尝试,我没有在 DSP 程序中进行任何处理。我只是将“处理完成”消息发送回 GPP。而这仍然会消耗大量时间。这可能是因为内部/外部内存使用,还是仅仅是因为通信过载?