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
находятся в одной и той же деформации.