如何使用OpenCL运行多队列代码?

时间:2014-04-14 13:50:46

标签: queue kernel opencl

例如,我正在对视频的每一帧进行一些图像处理工作。

每帧使用200ms进行处理,包括写入,处理和阅读。 并且fps是25,在这种情况下每两帧#f;距离是40ms。然后处理太慢,无法显示连续的结果。

所以这是我的想法,我使用多队列进行这项工作。

在CPU部分中,

while(video is not over)
{
   1. read the frame0;
    processing the **frame0** using **queue0**;
    wait 40 ms;

   2. read the frame1;
    processing the frame1 using **queue1**;
    wait 40 ms;

    3.4.5. 
    ...(after 5 frames(just about the 200ms's processing time))


    6. download the **frame0**'s result.

    7. read the frame5;
    processing the frame5 using **queue0**;
    wait 40 ms;
    ...
}

代码意味着,我使用不同的队列来阅读和处理视频中的同一帧。

然而,我的实验结果更快,但速度提高了2倍,但速度并不快。

谁能告诉我如何处理它?谢谢!

1 个答案:

答案 0 :(得分:1)

假设你有一台设备,这里有一些想法:

  • 每个OpenCL设备拥有多个命令队列(CQ)的主要原因是能够执行内核和同时进行IO操作。
  • 通常一个CQ应该以~100%加载单个设备。虽然,你的多CQ想法很好(在我看来),因为你不断地为GPU提供工作量。
  • 查看内核执行时间。可能是,它足够大,所以你的设备不断执行内核和放大器。不能再快了。
  • 我想,你不需要等待40ms。好的解决方案是处理队列中的帧,在这些帧中放置帧以消除比特流和帧之间的差异。显示顺序。
  • 如果您的CQ太多,您的OpenCL驱动程序线程将忙于维护它们,因此性能可能会下降。