首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用DSP加速OMAP上的代码?

如何使用DSP加速OMAP上的代码?
EN

Stack Overflow用户
提问于 2009-06-25 14:37:09
回答 3查看 6.1K关注 0票数 6

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

我尝试移植一个小的for循环,它运行在非常小的数据量(大约250个字节)上,但是在不同的数据上运行了大约200万次。但是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在完成处理时用消息通知GPP。只是为了尝试一下,我没有在DSP程序中放任何处理。我刚刚向GPP发送了一条“处理完毕”的消息。这还会消耗很多时间。这是因为内部/外部内存的使用,还是仅仅是因为通信过载?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-14 10:36:33

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

如果算法的总计算量与消息传递所需的时间相当,并且该算法适合在CPU和DSP上同时计算,则似乎只有将该算法移植到DSP上才是合理的。

票数 -1
EN

Stack Overflow用户

发布于 2009-06-25 16:03:28

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

如果您使用的是船上的IVA2+编码/解码引擎,您需要为这个单元使用适当的库,并且它只支持我所知道的特定的编解码器。你是想把自己的库写到这个模块上吗?

如果您使用DSPish (SIMD指令)中构建的Cortex,请发布一些代码。

如果你的开发板上有一些额外的DSP,什么是DSP,它是如何连接到OMAP的?

关于桌面GPU问题,在视频解码的情况下,您使用供应商提供的函数库对硬件进行调用,在linux上有几个用于Nvidia的VDAPU,在windows上有类似的库(PureViewHD,我认为它被调用了)。ATI也有linux和windows库,用于它们的车载解码引擎,我不知道它们的名称。

票数 2
EN

Stack Overflow用户

发布于 2009-06-25 16:47:18

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

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

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1044313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档