OpenGL вычисляет сопоставление шейдеров с деформациями nVidia - PullRequest
0 голосов
/ 08 декабря 2018

Допустим, у меня есть вычислительный шейдер OpenGL с local_size = 8 * 8 * 8.Как вызовы отображаются в деформациях GPU nVidia?Будут ли вызовы с тем же gl_LocalInvocationID.x находиться в одной и той же деформации?Или у?Или я?Я имею в виду не все вызовы, я просто имею в виду общую агрегацию.

Я спрашиваю об этом из-за оптимизаций, так как в один момент не все вызовы выполняют свою работу, поэтому я хочу, чтобы они были в одной и той же структуре.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Модель выполнения вычислительного шейдера позволяет количеству вызовов (значительно) превышать количество отдельных исполнительных блоков в варп / волновом фронте.Например, аппаратные размеры деформации / волнового фронта имеют тенденцию быть между 16 и 64, в то время как количество вызовов в рабочей группе (GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS) требуется в OpenGL, чтобы быть не менее 1024.

barrierвызовы и использование переменных данных shared, когда рабочая группа охватывает несколько деформаций / волновых фронтов, по сути, останавливает прогресс всех деформаций / волновых фронтов, пока каждый из них не пройдет эту конкретную точку.А затем выполнить различные операции очистки памяти, чтобы они могли обращаться к переменным друг друга (конечно, на основе использования барьера памяти).Если все вызовы в рабочей группе укладываются в одну деформацию, таких вещей можно избежать.

По сути, вы не можете контролировать, как вызовы CS группируются в деформации.Вы можете предположить, что реализация не пытается быть медленной (то есть она обычно группирует вызовы из одной и той же рабочей группы в одну и ту же основу), но вы не можете предполагать, что все вызовы в одной рабочей группебудет находиться в той же деформации.

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

0 голосов
/ 08 декабря 2018

В соответствии с этим: https://www.khronos.org/opengl/wiki/Compute_Shader#Inputs

  gl_LocalInvocationIndex =
          gl_LocalInvocationID.z * gl_WorkGroupSize.x * gl_WorkGroupSize.y +
          gl_LocalInvocationID.y * gl_WorkGroupSize.x + 
          gl_LocalInvocationID.x;

Так что вполне безопасно предположить, что вызовы с одинаковыми gl_LocalInvocationID.x находятся в одной и той же основе.

...