Какая польза от нескольких измерений в размере рабочей группы вычислительного шейдера? - PullRequest
0 голосов
/ 09 мая 2018

Вычислительные шейдеры требуют подсчета рабочих групп при отправке.Это должно быть поставлено в 3 измерениях.То же самое касается размера рабочей группы, указанного в самом вычислительном шейдере.

Функция для отправки вычислительного шейдера в OpenGl: glDispatchCompute.

Вопрос:

  • почему существует 3 измерения?
  • почему бы не передать 1 большое число?
  • как из трех измерений получится фактическое число?

1 Ответ

0 голосов
/ 09 мая 2018

Существуют вычисления, которые по своей природе 2 или 3 измерения. И есть вычисления, которые по своей природе являются одномерными. Кто-то будет испытывать неудобства. Либо многомерным пользователям придется взять 1D-индекс и превратить его в 2 / 3D-индексы, либо одномерным пользователям, возможно, придется взять 2 / 3D-индекс и сжать его до 1D.

Конечно, обратите внимание на разницу между "волей" и "май". Пользователи с одним измерением должны распознавать измерения Y или Z только в том случае, если ограничения реализации для измерения X команды dispatch слишком малы для выполнения достаточного количества вызовов. Учитывая, что во всех реализациях должно быть не менее 65535 рабочих групп для каждого измерения, что охватывает много вопросов.

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

как из трех измерений получается фактическое число?

Предполагая, что вам нужно использовать кординаты Y и Z в вашей одномерной вычислительной операции вообще (и вы делаете это редко), существует множество способов сделать это. Они различаются только в зависимости от порядка различных размеров. Следующий способ использует порядок gl_LocalInvocationIndex.

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

uint WorkGroupIndex = dot(gl_WorkGroupID, uvec3(1, gl_NumWorkGroups.x, gl_NumWorkGroups.x * gl_NumWorkGroups.y));

Если вам нужно получить индекс для каждого вызова в течение всего вызова диспетчеризации, возьмите WorkGroupIndex выше и сделайте следующее:

uint UniqueIndex = (WorkGroupIndex * gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z) + gl_LocalInvocationIndex;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...