【问题标题】:GPU YUV to RGB. Worth the effort?GPU YUV 转 RGB。值得努力?
【发布时间】:2011-02-01 02:39:50
【问题描述】:

我必须将几个完整的 PAL 视频 (720x576@25) 从 YUV 4:2:2 实时转换为 RGB,并且可能对每个视频进行自定义调整大小。 我曾想过使用 GPU,因为我已经看到了一些这样做的例子(除了它是 4:4:4,所以 bpp 在源和命运上是相同的)--http://www.fourcc.org/source/YUV420P-OpenGL-GLSLang.c

但是,我没有任何使用 GPU 的经验,我不确定可以做什么。据我了解,该示例只是将视频帧转换为 YUV 并显示在屏幕上。

是否可以改为获取已处理的帧?将其发送到 GPU、对其进行转换并再次发送到主内存是否值得付出努力,还是会降低性能?

有点特定于平台,假设我在 Windows 上工作,是否可以从窗口获取 OpenGL 或 DirectDraw 表面,以便 GPU 可以直接绘制到它?

【问题讨论】:

    标签: rgb gpu gpgpu yuv


    【解决方案1】:

    我实际上已经用 C 语言为 CUDA 编写了这个程序,并用 C 语言编写了一个 pthreads。(不过,请注意,只是为了好玩。)而且我发现 GPU 运行速度非常快,以至于你花费了 50-80% 的时间来回发送数据,即使每次都完全填满 GPU 的内存。因此,CPU 完成这项工作的速度几乎与 GPU 一样快。正如您可能已经发现的那样,这个问题对线程非常友好,因此对于现代硬件,内存带宽是最大的问题。

    我使用 Core i7 作为 CPU 和 GeForce 8800GT/GTX 285 作为显卡对此进行了测试。 GTX285 可处理 1920x1080 视频的 afaik 1500fps,因此无论您选择什么,速度都会非常快。

    【讨论】:

    • 正如我在上一个回复中评论的那样,即使使用高度优化的 IPP 库,我的 CPU 也无法获得这种性能。我“只”要处理 500 fps 的 PAL 视频,而且如果运气好的话,它似乎可以足够快地进行颜色转换(忘记调整大小),但是 1920x1080 大约是 6 倍,所以你是说到大概 8-9000 fps。将尝试CUDA。关于从哪里开始有什么建议吗?我对这个 GPUGP 的东西一无所知,而且它似乎相当压倒性。非常感谢。
    【解决方案2】:

    真正的问题是,你希望从中得到什么?

    在您接收视频的帧速率下,您可以使用英特尔 Performance Primitives 之类的工具来执行您需要的几项操作并轻松跟上流。

    如果你想学习如何进行 gpu 编程,这是一个很好的简单问题,你可以实现。

    可以通过从 gpu 回读到内存来获取处理后的帧。实际机制将根据您使用的 api(OpenGL、DirectX、CUDA、OpenCL)而有所不同。我已经用更高分辨率的视频完成了它,并且仍然跟上了 25fps 的流。但是,这一切都取决于您将使用的硬件。

    DirectX 和 OpenGL 都有关于使用窗口表面作为渲染目标的精彩教程。

    【讨论】:

    • 我不确定我是否说清楚了。我必须同时处理几个视频。上限肯定在 15 到 20 之间。所以我可能不得不处理 500 fps。我以前没有听说过 IPP,并且已经玩了几天了。看起来很棒,YUV 到 RGB 的转换似乎也够快了。但是,没有办法直接调整非平面 YUV 图片的大小,而且 RGB 调整大小非常慢——仅调整一个视频的大小会使我的四核至强 CPU 使用率达到 70-80%。我现在来看看 CUDA。
    • 在使用多个线程来调整大小时,CPU 使用率问题似乎是上一个 IPP 版本中的一个错误。 IPP终于解决了我的问题,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2011-04-06
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多