OpenGL вычисляет сопоставление шейдеров с деформациями nVidia

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

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

2 ответа

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

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

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

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

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

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

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

Другие вопросы по тегам