HI,大家好:
我实现了这样一个算法,算法会循环读取视频的每一帧,然后将得到的帧放到GPU上处理(使用openCL)。为了测试性能,对这个算法采用了两种实现方法:
1.串行:读取一帧,放到gpu处理,处理完后得到结果,然后进行下一帧的处理;
2.并行:主线程读取一帧,然后将该帧放到子线程处理(该子线程使用gpu处理),并从子线程中获取上一帧的结果,然后读取下一帧;
在高通Qualcomm Snapdragon 801 (adreno 330)以及mt6752(mali t760)的机子上进行了测试,测试结果是高通第二种实现方式明显快于第一种,而在mt6752 上却是相反的结果,两个机子的CPU性能是差不多的。理论上讲,不论哪个机子,第二种都会优于第一种,但在mali T760 上测试结果却不一样。请各位大神帮忙分析下啊,小弟实在没办法了。
你好,
基于你目前给出的信息,我暂时无法给出一个明确的回答,你可以提供更加详细的信息吗?比如说,读进来的视频帧是通过什么方式传到CL去的;并行的时候怎样确保上一帧数据已经处理完毕。
谢谢!
Sheri
我发现了问题原因,在并发的时候,mali GPU 是在openCL 和渲染同时进行的,openCL的计算时间比较慢。我想进一步了解的是,mali-GPU 在调度既有openCL 又有渲染的时候是如何进行的。谢谢!
Phenix
关于你的上一个问题。
高通视频解码器解码送的buffer是由显示模块来申请的。
申请的是uncache的buffer,读取uncache的buffer会耗费差不多30-50ms的样子。
这个地方也会影响你的Performance。
Mali的视频解码器申请的buffer没了解过。
Hi Phenix,
我想问一下你说的在并发的时候mali GPU是在OpenCL和渲染同时进行的具体是指什么?是指OpenCL和OpenGL ES同时在运行吗?
OpenGL ES和OpenCL是可以并行的,如果它们之间有交互操作的话,会有Event来控制,这个需要自己在写Application的时候指定。
另外,OpenCL的Kernel在不同的GPU上,需要根据GPU的特性进行优化,性能才能达到最优。
如果方便的话,能否可以说的更具体些,这样的话,可以更有针对性地解答你的疑惑。
opencl and opengles Interop problem Peter Harris 对此问题的回答。