2013-12-16 2 views
0

Я пишу текстуру в DirectX, а затем читаю ее в ядре CUDA. Я использую cudaGraphicsMapResources перед запуском ядра. Иногда это занимает 10-30 мс. Конечно, это вызывает framedrop в приложении. Текстура записывается только в DirectX и читается только в CUDA, не используется нигде.cudaGraphicsMapResources медленная скорость при отображении текстуры DirectX

Я пробовал разные вещи, например, ждать несколько кадров, но это не всегда помогает. Я также попытался вызвать cudaGraphicsMapResources только в начале (вместо того, чтобы называть его каждый раз), но тогда у меня нет гарантии, что DirectX уже закончил писать текстуру (иногда это не так). Я пытался использовать потоки, но он сбой, когда я вызываю cudaGraphicsMapResources из другого потока.

У меня также сложилось впечатление, что это происходит главным образом, когда включен vsync.

Это известная проблема? Что вызывает это? Есть ли способ проверить, готов ли ресурс не блокирующим способом? Или вообще есть какое-то обходное решение?

У меня есть GeForce GTX 670, Windows 7 64 бит, драйвер ver. 331,82.

ответ

1

Из документации CUDA на cudaGraphicsMapResources():

Эта функция обеспечивает гарантию синхронизации, что любые графические вызовы, выданные до cudaGraphicsMapResources() будет завершена до начала любого последующего CUDA работы выдается в потоке.

Возможно, задержки, которые вы видите, вызваны ожиданием завершения чертежа. В частности, поскольку вы указываете, что, когда не отображается для каждого кадра, рисунок иногда не завершается.

Сочетание этого с vsync может затруднить проблему, поскольку графические вызовы могут ждать следующего vsync перед началом рисования.

Частичным обходным решением проблемы, когда используется vsync, может быть использование большего количества задних буферов.

Если вы еще этого не сделали, попробуйте позвонить cudaGraphicsResourceSetMapFlags() с помощью cudaGraphicsMapFlagsReadOnly.

Edit:

Я думаю, что он ждет только для рисования вызовов, сделанных вашего собственного приложение, чтобы закончить. Документы говорят:

Графический API, с которого были зарегистрированы ресурсы, не должен иметь доступ к каким-либо ресурсам, пока они отображаются на CUDA. Если приложение делает это, результаты не определены.

И, конечно же, вы не контролируете чертеж, выполняемый другими приложениями.

Возможно, вы можете проверить статус чертежа без блокировки, вызвав метод Direct3D Present() с флагом D3DPRESENT_DONOTWAIT.

+0

Я уже использую cudaGraphicsMapFlagsReadOnly. –

+0

Я уже использую cudaGraphicsMapFlagsReadOnly. Я не понимаю, чего именно он ждет?Остается ли ждать завершения рисования до моей текстуры (в моем случае это будет завершение вызовов StretchRect или ResolveSubresource), или он ожидает, что все графические вызовы, выпущенные до cudaGraphicsResource, будут выполнены, а графический процессор «свободен» для CUDA? Или что-то другое? В любом случае, есть ли способ уменьшить ожидание? Или просто проверить, готов ли он без блокировки? –

+0

«И, конечно же, у вас нет контроля над рисунком, выполняемым другими приложениями». Нет, я имею в виду другие графические вызовы в рамках одной и той же программы. Я рисую свою текстуру, а также делаю некоторые другие вещи. –

Смежные вопросы