Я пытаюсь реализовать один комплексный алгоритм с использованием графического процессора. Единственная проблема - ограничения HW, а максимальный доступный уровень функции - 9_3.DirectX 11, Объединение пиксельных шейдеров для предотвращения узких мест
Алгоритм - это, в основном, алгоритм «сопоставления стерео» для двух изображений. Из-за упомянутых ограничений все вычисления должны выполняться только в вершинных/пиксельных шейдерах (нет доступных API вычислений). Вершинные шейдеры здесь бесполезны, поэтому я рассматривал их как сквозные шейдеры вершин.
Позвольте мне коротко описать алгоритм:
Возьмите два изображения и вычисления карты объема затрат (в основном conterting RGB в оттенки серого -> перевести правильное изображение на D и вычесть его из левого изображения). Этот шаг повторяется примерно 20 раз для разных D, который генерирует Texture3D.
Проблема здесь: Я не могу просто создать один Pixel Shader, который вычисляет эти 20 повторений в один раз из-за размером ограничения Pixel Shader, поэтому я вынужден позвонить Draw (макс 512 арифметики.)() в цикле на C++, который ненужно связан с CPU, когда все операции выполняются на с теми же двумя изображениями - мне кажется, что у меня есть одно узкое место здесь. Я знаю, что есть несколько целей рендеринга, но: есть макс. 8 (мне нужно 20+), если я хочу сгенерировать 8 результатов в одном пиксельном шейдере, я превышу его ограничение по размеру (512 арифметических для моего HW).
Тогда мне нужно вычислить для каждого из вычисленной текстуры коробки фильтра с окнами, где г> 9.
Еще одна проблема: Поскольку окно является настолько большим, мне нужно разделить окно фильтрации в два пиксельных шейдера (вертикальное и горизонтальное направление отдельно), потому что петли разворачивают результаты сцены с очень длинным кодом. Ручная реализация этих циклов не поможет, потому что он будет создан для большого пиксельного шейдера. Так вот еще узкое место здесь - CPU должен быть задействован для передачи результатов от текстуры temp (результат V-прохода) до второго прохода (H pass).
Затем на следующем этапе для каждой пары результатов с 1-го шага и 2-го шага применяются некоторые арифметические операции.
Я еще не пришел сюда с моим развитием, поэтому не знаю, какие узкие места ждут меня здесь.
Тогда минимальное D (значение параметра из 1-го шага) берется для каждого пиксела на основе значения пикселя с шага 3.
... такой же, как на шаге 3.
Здесь в основном ОЧЕНЬ простой график, показывающий мою текущую реализацию (исключая шаги 3 и 4).
красные точки/кружки/независимо представляют собой временные буферы (текстуры), где частичные результаты сохраняются и при каждом красной точкой CPU становится участие.
Вопрос 1: Невозможно ли каким-либо образом позволить GPU знать, как выполнять каждую форму ветви до дна, не вовлекая процессор и приводя к узкому месту? То есть программировать последовательность графических конвейеров за один раз, а затем позволить графическому процессору выполнять свою работу.
Еще один вопрос о визуализации для текстуры: все ли текстуры постоянно хранятся в памяти графического процессора даже между вызовами метода Draw() и переключением пиксельных/вершинных шейдеров? Или есть передача с GPU на CPU, происходящее ... Потому что это может быть еще одна проблема, которая приводит к узкому месту.
Любая помощь будет оценена!
Заранее спасибо.
С наилучшими пожеланиями, Лукаш
Спасибо за ваш ответ! –
Вы развеяли мои сомнения. Проблема с моей разработкой заключается в том, что я разрабатываю для мобильного устройства, и я не могу найти подходящий профилировщик GPU для этого. Возможно, я попытаюсь запустить свой код на каком-то старом ПК со «сравнимой» производительностью, чтобы увидеть, как он себя ведет. Еще раз спасибо! –