我正在写入DirectX中的纹理,然后在CUDA内核中读取它。我在启动内核之前使用cudaGraphicsMapResources。有时需要10-30毫秒。当然,这会导致应用程序中的framedrop。纹理只用DirectX编写,只能在CUDA中读取,不能在其他地方使用。
我尝试了不同的东西,比如等待几帧,但它并不总是有帮助。我也试图仅在开始时调用cudaGraphicsMapResources(而不是每次都调用它),但是我不能保证DirectX已经完成编写纹理(有时它没有)。我尝试使用线程,但是当我从不同的线程调用cudaGraphicsMapResources时崩溃了。
我还有一种印象,即当启用vsync时,它主要发生。
这是一个已知问题吗?是什么导致这个?有没有办法测试资源是否以非阻塞方式就绪?或者一般来说有一些解决方法吗?
我有GeForce GTX 670,Windows 7 64位,驱动程序版本。 331.82。
答案 0 :(得分:1)
来自cudaGraphicsMapResources()
的CUDA文档:
此函数提供同步保证,在cudaGraphicsMapResources()之前发出的任何图形调用将在流中发出的任何后续CUDA工作开始之前完成。
可能是您看到的延迟是由等待绘图完成引起的。特别是因为您指出,当不为每个帧进行映射时,绘图有时不会完成。
将此与vsync相结合可能会使问题变得更糟,因为图形调用可能必须在开始绘制之前等待下一个vsync。
使用vsync时问题的部分解决方法可能是使用更多后备缓冲区。
如果您还没有,也可以尝试使用cudaGraphicsResourceSetMapFlags()
致电cudaGraphicsMapFlagsReadOnly
。
修改强>
我认为它只等待您自己的应用程序完成的调用。文档说:
从中注册资源的图形API在CUDA映射时不应访问任何资源。如果应用程序这样做,则结果未定义。
当然,你无法控制其他应用程序执行的绘图。
您可以通过使用Present()
标志调用D3DPRESENT_DONOTWAIT
Direct3D方法来检查绘图状态而不会阻止。