Дилемма параллелизма GPU

Мой вопрос: OpenGL рисует примитивы параллельно или только растрирование выполняется таким образом? Проще говоря, если я хочу нарисовать один и тот же примитив дважды, будет ли он отображаться быстрее, если я дважды скопирую свои вершины в буфер и просто вызову drawarrays один раз, или это приведет к той же скорости рендеринга, как если бы я копировал только свои вершины? один раз и дважды вызывал drawarrays (не считая времени, которое требуется процессору для вызова графического процессора)


person CivDav    schedule 26.05.2014    source источник


Ответы (1)


Зависит от графического процессора и драйвера; типичная графическая карта имеет несколько ядер, которые могут выполнять один и тот же путь кода для нескольких наборов данных. Это классический параллелизм Одна инструкция, несколько данных и ядро ​​параллелизма OpenGL.

Двойной вызов drawArrays в этом случае не поможет, так как весь конвейер будет выполняться дважды.

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

person ratchet freak    schedule 26.05.2014
comment
То, что я пытаюсь сделать, это нарисовать кривую Безье и кривую b-сплайна на основе одних и тех же контрольных точек. Я хочу сделать большую часть вычислений в геометрическом шейдере, а точки передать в юниформе. Это означает, что для безье требуется один вызов geom.shader и один для b-сплайна. Итак, я пытаюсь решить вызвать geom.shader дважды и изменить логическую форму между ними, которая переключает geom.shader с Безье на b-сплайн, или вызвать его один раз, bool, помещенный в VAO, переключая геом.шейдер. Если два экземпляра geom.shader работают параллельно, то второй будет быстрее. - person CivDav; 26.05.2014
comment
Выполнение конвейера дважды не имеет значения, потому что вершинный шейдер проходит, а фрагмент просто показывает белый цвет. Однако geom.shader тяжелый (вычисление кривых Безье или b-сплайнов требует много вычислений), поэтому было бы очень полезно, если бы я мог указать графическому процессору запускать geom.shader для Безье, одновременно запуская geom.shader для б-сплайн. - person CivDav; 26.05.2014
comment
Шейдеры @CivDav Geometry на самом деле трудно распараллелить, потому что количество выходных данных (испускаемых вершин/примитивов) может варьироваться в зависимости от выполнения во время выполнения. На других этапах рабочий процесс лучше определяется до начала выполнения. Предполагая статический поток управления в шейдере геометрии, вы можете предположить, что реализация попытается распараллелить вызовы GS, когда это имеет смысл. Однако все это выходит за рамки любого API рендеринга рабочего стола. - person Andon M. Coleman; 26.05.2014