Обнаружил такую особенность видеокарт AMD:
То есть в пределах одного варпа доступ к массиву ресурсов (буферы, текстуры и тд) может быть неоптимальным.
Эта фича часто используется в трассировке лучей и полностью поддерживается на NV RTX.
Мобильные GPU на Android и iOS в основном имеют нативную поддержку, получается только AMD отстает.
#amd_gpu #vk
a
sh
derUniformBufferArrayNonUniformIndexingNative: false,
shaderSampledImageArrayNonUniformIndexingNative: false,
shaderStorageBufferArrayNonUniformIndexingNative: false,
shaderStorageImageArrayNonUniformIndexingNative: false,
shaderInputAttachmentArrayNonUniformIndexingNative: false,
кументации Vulkan API:
Из до
shaderUniformBufferArrayNonUniformIndexingNative is a boolean value indicating whether uniform buffer descriptors natively support nonuniform indexing. If this is VK_FALSE, then a single dynamic instance of an instruction that nonuniformly indexes an array of uniform buffers may execute multiple times in order to access all the descriptors.
То есть в пределах одного варпа доступ к массиву ресурсов (буферы, текстуры и тд) может быть неоптимальным.
Эта фича часто используется в трассировке лучей и полностью поддерживается на NV RTX.
Мобильные GPU на Android и iOS в основном имеют нативную поддержку, получается только AMD отстает.
#amd_gpu #vk
RDNA3 Instruction Set Architecture
* (1.2.2.1) Локальный кэш (LDS) содержит 64 атомика для быстрого доступа в преелах work-group.
* (1.2.2.2) Глобальный кэш (GDS) содержит 2 атомика для быстрого доступа.
* (2.1) wave64 (subgroupSize=64) вызывает все инструкции дважды.
* (2.3) CU и WGP режимы работы для work-group. Один WGP может содержать waves с обоими режимами работы, видимо это нужно для лучшей производительности графики при комбинации вершинного шейдера и меш шейдеров.
* (6.2) Некоторые константы заданы специальными константами, например: 0.5, 1.0, 2.0, 4.0, 1.0/(2*Pi).
* (7.9) WMMA инструкция для умножения матриц fp16 16х16.
* (10.4) Есть поддержка 16 битных деривативов. Есть 64 битные атомарные операции над текстурами.
#amd_gpu
* (1.2.2.1) Локальный кэш (LDS) содержит 64 атомика для быстрого доступа в преелах work-group.
* (1.2.2.2) Глобальный кэш (GDS) содержит 2 атомика для быстрого доступа.
* (2.1) wave64 (subgroupSize=64) вызывает все инструкции дважды.
* (2.3) CU и WGP режимы работы для work-group. Один WGP может содержать waves с обоими режимами работы, видимо это нужно для лучшей производительности графики при комбинации вершинного шейдера и меш шейдеров.
* (6.2) Некоторые константы заданы специальными константами, например: 0.5, 1.0, 2.0, 4.0, 1.0/(2*Pi).
* (7.9) WMMA инструкция для умножения матриц fp16 16х16.
* (10.4) Есть поддержка 16 битных деривативов. Есть 64 битные атомарные операции над текстурами.
#amd_gpu
How mesh shaders are implemented in an AMD driver
* У AMD внутри "страые" шейдеры (вершинный/тесселяции/геометрический) преобразуются в примитив шейдер, аналогичный меш шейдерам.
* Каждый поток в меш шейдере может писать в любую вершину и примитив, но для этого выделяется общая память воркгуппы. Этого можно избежать, если каждый поток пишет только в одну вершину и в один примитив.
*
Task shader driver implementation on AMD HW
* Таск шейдеры выполняются на компьют очереди, а потом графическая очередь выполняет меш шейдеры.
* От использования таск шейдеров есть потеря производительности, поэтому лучше их использовать для больших задач, где потери в драйвере значительно меньше по сравнению с проделанной работой.
#gpu_opt #amd_gpu
* У AMD внутри "страые" шейдеры (вершинный/тесселяции/геометрический) преобразуются в примитив шейдер, аналогичный меш шейдерам.
* Каждый поток в меш шейдере может писать в любую вершину и примитив, но для этого выделяется общая память воркгуппы. Этого можно избежать, если каждый поток пишет только в одну вершину и в один примитив.
*
hw workgroup size = max(api workgroup size, max vertex count, max primitive count)
по этой формуле расчитывается сколько потоков будет использовано.Task shader driver implementation on AMD HW
* Таск шейдеры выполняются на компьют очереди, а потом графическая очередь выполняет меш шейдеры.
* От использования таск шейдеров есть потеря производительности, поэтому лучше их использовать для больших задач, где потери в драйвере значительно меньше по сравнению с проделанной работой.
#gpu_opt #amd_gpu