Максимальное количество потоков вычислительного шейдера Vulkan

#gpu #vulkan #compute-shader

Вопрос:

Как я могу использовать Vulkan для запроса максимального количества возможных потоков/вызовов. И что произойдет, если я превыслю это число?

Ответ №1:

Это зависит от того, что вы подразумеваете под «максимальным числом». Есть две вещи, которые вы могли бы иметь в виду.

  1. Максимальное общее количество вызовов, которые могут быть выполнены в рамках одного вызова диспетчера.

    Вызов диспетчера выполняет некоторое количество рабочих групп, внутри которых выполняется некоторое количество рабочих элементов (он же: вызовы). Последнее определяется в самом шейдере с local_size_x/y/z помощью объявлений. Они подлежат ограничению maxComputeWorkGroupInvocations . То есть произведение local_size_x/y/z должно быть меньше или равно этой величине.

    Однако каждое из этих измерений x/y/z само по себе подвержено ограничениям, определенным maxComputeWorkGroupSize . Это массив из 3 значений, ограничивающих x/y/z соответственно. То есть каждое измерение не может превышать предел, определенный этим ограничением.

    Тем не менее, произведение этих ограничений будет больше , чем maxComputeWorkGroupInvocations , так что это ограничение, на которое вы должны обратить внимание.

    Данный вызов диспетчерской отправляет некоторое количество рабочих групп, которые сами имеют индексы x/y/z. Максимальное число вдоль каждого измерения определяется maxComputeWorkGroupCount массивом. Особых ограничений не существует, поэтому произведение каждого из этих элементов массива определяет максимальное количество групп, которые вы можете отправить.

    Таким образом, общее количество вызовов, которые может выполнить вызов диспетчера, равно: (maxComputeWorkGroupCount[0] * maxComputeWorkGroupCount[1] * maxComputeWorkGroupCount[2]) * maxComputeWorkGroupInvocations .

  2. Максимальное количество вызовов, которые могут выполняться одновременно в одном ядре выполнения. Это было бы полезно для оптимизации размеров рабочих групп и знания того, сколько вызовов может удобно обмениваться данными без чрезмерной синхронизации.

    Этот номер технически невозможно запросить. Однако вы можете запросить что-то, что, вероятно, представляет это число.

    Вулкан 1.1 добавил subgroupSize свойство, которое вы можете запрашивать с физического устройства. «Подгруппа»-это набор вызовов, которые могут взаимодействовать друг с другом. Эта переменная определяет размер подгруппы по умолчанию.

    Это, вероятно, то же самое, что и количество вызовов, которые могут выполняться в пошаговом режиме. Но он в основном используется для взаимодействия между подгруппами, поэтому, если графический процессор не предлагает этого в качестве функции, это, вероятно, будет установлено в 1. Что не является количеством вызовов, которые могут выполняться последовательно на этом оборудовании. Так что используйте его на свой страх и риск.

Ответ №2:

maxComputeWorkGroupCount показывает максимальный глобальный размер рабочей группы. maxComputeWorkGroupSize показывает максимальный размер локальной рабочей группы. maxComputeWorkGroupInvocations показывает максимальное количество вызовов локальной рабочей группы.

Если вы превысите эти цифры, это будет неопределенное поведение.