cudaGraphicsMapResources在映射DirectX纹理时速度慢

时间:2013-12-16 19:06:20

标签: cuda

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

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

我还有一种印象,即当启用vsync时,它主要发生。

这是一个已知问题吗?是什么导致这个?有没有办法测试资源是否以非阻塞方式就绪?或者一般来说有一些解决方法吗?

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

1 个答案:

答案 0 :(得分:1)

来自cudaGraphicsMapResources()的CUDA文档:

  

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

可能是您看到的延迟是由等待绘图完成引起的。特别是因为您指出,当不为每个帧进行映射时,绘图有时不会完成。

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

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

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

修改

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

  

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

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

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