У меня есть шейдерная программа в Open GL ES. Я хочу настроить локальные / глобальные размеры рабочей группы для выполнения одномерной задачи с помощью Compute Shader.
У меня есть общий размер задачи (общее количество потоков, которые могут меняться между различными запусками), скажем, [task_size]. Скажем, я указываю размер локальной рабочей группы, пусть это будет [local_size]. А также я знаю, сколько у меня рабочих групп, скажем, [рабочих групп].
Я указываю локальный размер как здесь:
layout(local_size_x = [local_size]) in;
И я указываю количество рабочих групп в glDispatchCompute:
glDispatchCompute([workgroups], 1, 1);
Если local_size * workgroups == task_size
, я четко понимаю, что происходит. Каждая часть задачи вычисляется отдельной группой.
Но что произойдет, если task_size не делится равномерно на local_size? Я понимаю, что минимальное количество рабочих групп, которое мне нужно, это task_size / local_size + 1
. Но как это работает? Последняя рабочая группа на самом деле меньше других? Влияет ли это на производительность? Это хорошая идея, чтобы сделать task_size равномерно делиться на local_size?