Использование шейдеров для длительных вычислений без задержки

Я пытаюсь использовать Compute Shader с DirectX 11 для выполнения простых, но дорогостоящих вычислений (вспомните набор Мандельброта). Результат расчета размещается на текстуре и не перекрывается. Это не в реальном времени, так как ожидается, что это займет от 1 до 10 секунд, но оно будет отображаться в пользовательском интерфейсе, как только оно завершится.

Я использую WPF и SharpDX через http://directx4wpf.codeplex.com/ . В этой библиотеке есть объект представления DX11 с функцией RenderScene, в которой вызываются функции рендеринга DX (включая компьютерный шейдер), и они запускаются в основном потоке и, насколько я понимаю, вызываются так часто, как это возможно (пытается максимизировать FPS). ). Ясно, что втыкать компьютерный шейдер туда нельзя, так как он заблокирует основной поток вместе с остальным пользовательским интерфейсом и даже остальной частью ОС, если он также использует графический процессор.

Вопрос в том, как мне выполнить эти вычисления, не вызывая задержек в пользовательском интерфейсе остальной части приложения?

Если бы это выполнялось исключительно на процессоре, я бы просто запустил отдельный поток. Однако, с моим элементарным пониманием GPU, и в настоящее время у меня сложилось впечатление, что GPU не очень подходит для планирования/переключения контекста. Следовательно, даже если я запущу вычисление в другом потоке (используя отложенный рендеринг в DX11), вычисление все равно будет блокировать GPU до тех пор, пока оно не будет выполнено. Это правильно?

Я попытался разделить работу вычислительного шейдера на более мелкие части (примерно 8000 потоков). Это выполнимо, если нет базовой геометрии, я могу просто добавлять смещение каждый раз, когда вызываю вычислительный шейдер. Это действительно не работает, так как есть огромные накладные расходы. На самом деле, разделение работы на N частей (путем последовательного вызова вычислительного шейдера N раз), по-видимому, приводит к линейному замедлению в N раз. Я не уверен, что это связано с упомянутой выше библиотекой WPF, SharpDX. , или просто неизбежный факт использования графического процессора.

У кого-нибудь есть предложения о том, как действовать в таких сценариях, возможно, примеры проектов, которые делают что-то подобное, или, возможно, хорошие ресурсы для чтения? Делаю ли я какие-то ложные предположения?


person Advecticity    schedule 25.06.2013    source источник


Ответы (1)


Это правильно, что выполнение этой 10-секундной операции заблокирует ваш графический процессор. По моему опыту, вы можете получить сумасшедшее поведение/сбои драйвера графического процессора, когда ваши вычисления занимают так много времени, особенно когда вы пытаетесь смешать содержимое пользовательского интерфейса и DirectX. Я предлагаю вам продолжить путь разделения вычислений на более мелкие потоки и поискать другие способы оптимизации ваших вычислений или даже рефакторинга вашего кода.

person alanw    schedule 25.06.2013