2013-12-16 64 views
0

我在DirectX中寫入紋理,然後在CUDA內核中讀取它。我在啓動內核之前使用cudaGraphicsMapResources。有時需要10-30毫秒。當然,這會導致應用程序中出現framedrop。紋理僅用DirectX編寫,只能在CUDA中讀取,不能在其他地方使用。cudaGraphicsMapResources當映射DirectX紋理時速度較慢

我嘗試了不同的東西,比如等待幾幀,但它並不總是有幫助。我也試着只在開始時調用cudaGraphicsMapResources(而不是每次調用它),但是我不能保證DirectX已經完成編寫紋理(有時它沒有)。我試圖使用線程,但當我從不同線程調用cudaGraphicsMapResources時,它崩潰。

我也有這樣的印象,它主要發生在啓用vsync時。

這是一個已知的問題?這是什麼原因?有沒有辦法測試資源是否以非阻塞方式準備好?或者總體來說有一些解決方法?

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

回答

1

從CUDA文檔上cudaGraphicsMapResources()

此功能提供了同步保證在流發出的任何後續CUDA工作開始之前cudaGraphicsMapResources之前發佈的任何圖形()的調用將完成。

可能是因爲等待繪圖完成而導致延遲。特別是因爲您指出,如果沒有爲每個框架進行映射,則繪圖有時未完成。

將此與vsync結合可能會使問題變得更糟,因爲圖形調用可能必須在開始繪製之前等待下一個vsync。

vsync正在使用時的問題的部分解決方法可能是使用更多的後臺緩衝區。

如果你還沒有,你也可以嘗試致電cudaGraphicsResourceSetMapFlags()cudaGraphicsMapFlagsReadOnly

編輯:

我認爲這只是等待通過繪製自己的應用程序製作完成呼叫。文檔說:

註冊資源的圖形API在CUDA映射時不應該訪問任何資源。如果應用程序這樣做,結果是不確定的。

而且,當然,您無法控制其他應用程序執行的繪圖。

通過使用D3DPRESENT_DONOTWAIT標誌調用Present() Direct3D方法,您也許能夠在不阻塞的情況下檢查繪圖狀態。

+0

我已經在使用cudaGraphicsMapFlagsReadOnly。 –

+0

我已經使用cudaGraphicsMapFlagsReadOnly。我不明白它到底在等什麼?它是否只是等待繪製到我的紋理來完成(在我的情況下,這將完成StretchRect或ResolveSubresource調用),還是等待執行cudaGraphicsResource之前發出的所有圖形調用,並且GPU對CUDA「免費」?或者是其他東西?無論如何,有沒有辦法減少等待時間?或者只是測試它是否已經準備好而不會阻塞? –

+0

「當然,您無法控制其他應用程序執行的繪圖。」不,我的意思是同一個程序中的其他圖形調用。我畫我的紋理,也做一些其他的東西。 –