Существуют вычисления, которые по своей сути являются 2-х или 3-х мерными. И есть вычисления, которые по своей сути одномерны. Кому-то будет неудобно. Либо многомерным пользователям придется взять 1D-индекс и преобразовать его в 2/3D-индексы, либо одномерным пользователям, возможно, придется взять 2/3D-индекс и сжать его до 1D.
Конечно, обратите внимание на разницу между «будет» и «может». Пользователям с одним измерением необходимо распознавать измерения Y или Z только в том случае, если ограничения реализации по измерению X команды диспетчеризации слишком малы для выполнения достаточного количества вызовов. Учитывая, что все реализации должны обеспечивать не менее 65 535 рабочих групп для каждого измерения, это охватывает много вопросов.
Таким образом, несмотря на то, что многомерный характер вычислительных операций может создавать неудобства для одномерной работы, существует множество одномерных задач, которые не вызывают неудобств. Так что "может" предпочтительнее "будет".
как 3 измерения приводят к фактическому числу?
Предполагая, что вам вообще нужно использовать координаты 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;
person
Nicol Bolas
schedule
09.05.2018