Сколько потоков в каждом состоянии конвейера OpenGL? - PullRequest
0 голосов
/ 06 июня 2018

Как определяется количество потоков для конвейера OpenGL на каждом этапе?

Под этим я подразумеваю, скажем, у меня есть 2 программы:

В одной у меня есть 600 треугольников, однако этивсе треугольники находятся в одном положении и настолько малы, что растеризуются до одного пикселя /

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

В первом случае для вершинного шейдера имеет смысл иметь 600 * 3 потока, а для фрагментного шейдера - 1 поток.

Во втором случае имеет смысл для вершинного шейдера:иметь только три потока и шейдер фрагмента, чтобы иметь потоки 1920 * 1080.

Однако я не думаю, что именно так фактически управляются потоки.

Так сколько потоков на самом деле генерируется на каждом этапе конвейера?

Есть ли способ хотя бы частично повлиять на количество генерируемых потоков?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Для целей этого разговора я предполагаю, что под «потоком» вы подразумевали «вызов» .«Темы» не существуют в GLSL;только "вызовы".

В первом случае для вершинного шейдера имеет смысл иметь 600 * 3 потока, а для фрагментного шейдера - 1 поток.

Нет, не будет.

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

Фрагмент шейдера еще менее четко определен.Возможно, аппаратное обеспечение осознало, что все потенциальные вызовы растеризатора будут перезаписывать одни и те же места ... и, возможно, это не так.Кроме того, большинство растеризаторов будут выполнять несколько вызовов, даже если будет записан только один фрагмент из треугольника.Эти скрытые вызовы используются для вычисления градиентов для текстурных координат и, как правило, существуют для ускорения работы общего случая.

Во втором случае имеет смысл, чтобы вершинный шейдер имел только три потока ифрагментный шейдер должен иметь 1920 * 1080 потоков.

Он может работать больше этого.

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

Таким образом, в то время как VS создаст один треугольник, растеризатор, скорее всего, увидит 2 или даже 3 треугольника.

Этоозначает, что между краями этих треугольников будут области перекрытия, где будут существовать те «скрытые» вызовы FS, о которых я говорил.Таким образом, у вас, скорее всего, будет больше вызовов FS, чем у пикселей.

Итак, сколько потоков фактически генерируется на каждом этапе конвейера?

Вы не знаете,Вы не можете знать.И вообще говоря, вы не должны пытаться узнать.

Есть ли способ хотя бы частично повлиять на количество создаваемых потоков?

Да: сделать больше или меньше вещей.Это даст вам больше или меньше призывов.Это все, что дает вам OpenGL, и все, что вам нужно.

0 голосов
/ 06 июня 2018

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

Прежде всего, спецификация OpenGL определяет только те функции, которые вы можете вызывать, параметры, которые вы используете, и их поведение.Точно как драйвер OpenGL и GPU фактически выполняются, что является деталью реализации.Создатели графических процессоров разработали множество расширений для взаимодействия со своими аппаратными средствами вне спецификации, но я еще не видел ни одного, который бы делал то, что вы описываете.

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

  • доступные потоки
  • дополнительная загрузка (из других программ)
  • общие ресурсы
  • исторические вызовы (как выглядели входные данные в предыдущих кадрах)
  • историческая производительность шейдера (скорость фрагментного шейдера или скорость вершинного шейдера)
  • и т. д.

Однако, общаяреализация состоит в том, чтобы иметь пулы из N потоков, которые назначаются динамически для отдельных этапов конвейера на основе указанных выше переменных.Это означает, что если ваши фрагментные шейдеры занимают значительно больше вычислений, чем ваши вершинные шейдеры, в будущем для них, вероятно, будет выделено больше потоков.

...