Как выделить DirectX для GPU и выделить CUDA для другого GPU?

В моем приложении поток GUI использует Direct2D для отображения изображений, позволяя пользователю выполнять панорамирование и масштабирование, в то время как другой поток использует CUDA для обработки изображений. Чтобы предотвратить нарушение потока обработки изображения потоком GUI и ускорить процесс, был сделан выбор добавить отдельную графическую карту для вычислений CUDA со следующей настройкой:

  • Nvidia Quadro 400 для дисплея (Direct2D, продается с ПК, достаточно для отображения)
  • Nvidia GT640 исключительно для вычислений CUDA (добавлено специально для вычислений CUDA, потому что оно имеет больше ядер и, следовательно, более эффективно для того, что должно делать приложение, отключено для отображения в BIOS, экран не прикреплен). Поток CUDA содержит код, позволяющий использовать только этот GT640.

Тем не менее, это не сработало, как ожидалось, так как, когда пользователь просматривает изображение, вызывая несколько обновлений дисплея подряд, время выполнения CUDA прыгает с типичных 20 мс до 800 мс. Используя GPUView (который я обнаружил, исследуя эту проблему и совсем не осваивая), я смог увидеть, что поток CUDA, похоже, ожидает завершения обновления дисплея, прежде чем помещать свои команды в графический процессор. В то же время Direct2D большую часть времени не использует графический процессор (1 мс работы в течение 16 мс периода VSync). Похоже, что мои вызовы Direct2D блокируют все графические процессоры на 16 мс, а затем поток графического интерфейса позволяет потоку CUDA голодать (хотя эти потоки не синхронизируются ни в каком другом случае, кроме доступа к графическому процессору).

Итак, вопросы:

  • Что может происходить?
  • Поможет ли это заставить Direct2D работать только на одном конкретном графическом процессоре?
  • Это вообще возможно или я неправильно понимаю проблему?

1 ответ

Если вы используете цель визуализации ID2D1DeviceContext вместо ID2D1HWndRenderTarget, во время ее инициализации вы выбираете, какой адаптер вы хотите использовать для Direct3D.

http://msdn.microsoft.com/en-us/library/windows/desktop/hh780339(v=vs.85).aspx

См. Документы для D3D11CreateDevice или D3D11CreateDeviceAndSwapChain. Первый параметр указывает, какой адаптер использовать. http://msdn.microsoft.com/en-us/library/windows/desktop/ff476082(v=vs.85).aspx

Другие вопросы по тегам