【问题标题】:cudaGraphicsMapResources slow speed when mapping DirectX texturecudaGraphicsMapResources 映射 DirectX 纹理时速度慢
【发布时间】:2014-01-04 07:25:03
【问题描述】:

我在 DirectX 中写入纹理,然后在 CUDA 内核中读取它。在启动内核之前,我正在使用 cudaGraphicsMapResources。有时需要 10-30 毫秒。当然,这会导致应用程序中的丢帧。纹理只用 DirectX 编写,只在 CUDA 中读取,不用于其他任何地方。

我尝试了不同的方法,例如等待几帧,但并不总是有帮助。我还尝试仅在开始时调用 cudaGraphicsMapResources(而不是每次都调用它),但是我不能保证 DirectX 已经完成了纹理的写入(有时还没有)。我尝试使用线程,但是当我从不同的线程调用 cudaGraphicsMapResources 时它崩溃了。

我也觉得它主要发生在启用 vsync 时。

这是一个已知问题吗?这是什么原因造成的?有没有办法以非阻塞方式测试资源是否准备好?或者一般来说有一些解决方法吗?

我有 GeForce GTX 670,Windows 7 64 位,驱动程序版本。 331.82.

【问题讨论】:

    标签: cuda


    【解决方案1】:

    来自cudaGraphicsMapResources() 上的 CUDA 文档:

    此函数提供同步保证,即在 cudaGraphicsMapResources() 之前发出的任何图形调用将在流中发出的任何后续 CUDA 工作开始之前完成。

    您看到的延迟可能是由于等待绘图完成造成的。特别是因为您指出,当不为每一帧映射时,绘图有时还没有完成。

    将此与 vsync 结合使用可能会使问题变得更糟,因为图形调用可能必须等待下一个 vsync 才能开始绘制。

    使用 vsync 时该问题的部分解决方法可能是使用更多后台缓冲区。

    如果您还没有,您也可以尝试使用cudaGraphicsMapFlagsReadOnly 致电cudaGraphicsResourceSetMapFlags()

    编辑:

    我认为它只会等待您自己的应用程序进行的绘图调用完成。文档说:

    注册资源的图形 API 在 CUDA 映射资源时不应访问任何资源。如果应用程序这样做,结果是不确定的。

    当然,您无法控制其他应用执行的绘图。

    您可以通过使用D3DPRESENT_DONOTWAIT 标志调用Present() Direct3D 方法来检查绘图状态而不会阻塞。

    【讨论】:

    • 我已经在使用 cudaGraphicsMapFlagsReadOnly。我不明白它到底在等什么?它只是等待绘制到我的纹理完成(在我的情况下,这将是 StretchRect 或 ResolveSubresource 调用的完成)还是等待在执行 cudaGraphicsResource 之前发出的所有图形调用并且 GPU 对 CUDA“免费”?或者是其他东西?无论如何,有没有办法减少等待?或者只是测试它是否准备好而不阻塞?
    • “当然,您无法控制其他应用程序执行的绘图。”不,我的意思是同一程序中的其他图形调用。我绘制我的纹理并做一些其他的事情。
    • @st.:好问题,但我不知道。
    猜你喜欢
    • 2014-07-12
    • 1970-01-01
    • 2011-12-08
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2011-03-16
    相关资源
    最近更新 更多