【问题标题】:how to speed up dumping mermory from memory to GPU?如何加快将内存从内存转储到 GPU 的速度?
【发布时间】:2015-10-26 08:37:06
【问题描述】:

我正在 PC 上开发一些 AR(增强现实),我有摄像头捕捉,检测到某些标记特征,并将内存转储到 GPU 以在图像上渲染虚拟对象。我使用食人魔引擎。

/** Convenience function that blits a pixelbox from memory to the entire 
            buffer. The source image is scaled as needed.
            @param src      PixelBox containing the source pixels and format in memory
            @note Only call this function when the buffer is unlocked. 
        */
 mTexture->getBuffer()->blitFromMemory(mPixelBox);

对于 720P 图像输入,大约需要 100 毫秒,这对于渲染来说是不希望的。我有 i5-4460 @ 3.20GHz、16G 内存和 Geforce GTX 660 卡。

我知道 CPU 和 GPU 内存之间存在差距,但如果我只显示 720P 视频输入和 amcap,它只有 30fps。从 GPU 渲染的屏幕上是否出现任何内容?如何知道CPU和GPU显存的速度?

【问题讨论】:

  • 不确定这与 cuda 有什么关系
  • 这个 blitFromMemory 看起来像一个沉重的解决方案(缩放纹理......)。寻找一种更直接地加载纹理的方法,例如当它来自文件时。
  • 如果你想在屏幕上渲染虚拟对象,你可能应该看看像 OpenGL 这样的图形库。

标签: opengl gpu gpgpu ogre


【解决方案1】:

要有效地做到这一点,您确实需要能够容忍几帧延迟。

在 100 毫秒时,当以 30 FPS 绘制时,这实际上是额外的 2 帧。这种行为可以通过驱动程序提前排队多个帧来解释。

称为预渲染帧 (NVIDIA)/翻转队列大小 (AMD) 的驱动程序设置会增加 CPU 和 GPU 之间传输的任何数据的延迟。 3 是 AMD 驱动程序的默认值,目前尚不清楚 NVIDIA 的默认值是什么(但您讨论的数字表明它也是 3)。尝试将其设置为 1,这将限制 CPU/GPU 并行度(可能会降低帧速率),但会尽可能降低延迟。

不过,驱动程序没有将此设置为 1 是有原因的,这让我回到了最初的观点。尝试接受几帧的延迟,一切都会运行得更加顺畅 - 您很可能没有遇到 I/O 传输限制,只是并行性问题。

【讨论】:

  • 这完全取决于您如何测量上传图像数据所花费的时间。我不知道 Ogre 是如何做到这一点的,但是在 GL 中,如果您使用栅栏同步对象来检测上传完成的时间,我刚才描述的内容会影响报告的数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 2011-02-03
  • 2018-05-18
  • 2012-06-15
  • 2015-04-14
  • 1970-01-01
  • 2013-02-09
相关资源
最近更新 更多