Список тэгов
Программирование
#cpp - C++
#cpu_opt - оптимизации для ЦП
#atomics - атомарные операции, работа с кэшем
#threading - многопоточка
#lockfree - Lock free, wait free алгоритмы
#backend - сервера
#ecs - entity component system
#dod - data oriented design, низкоуровневая оптимизация
Графические API, работа на низком уровне
#gpu_opt - оптимизации для ГПУ
#gapi - все графические API
#vulkan #vk - Vulkan API
#metal - Apple Metal
#opengl #gl - OpenGL
#dx - DirectX 11, 12
Рендеринг
#cg - все что связано с компьютерной графикой
#proc_gen - процедурная генерация
#games - обзор технологий из игр
Другое
#news - новости по теме
#blog - новости по моим разработкам
#hw - все что связано с компьютерным железом
#desktop #win #mac #linux - относится к ПК, ноутбуки
#mobile #android #ios - относится к мобильным платфомам
#vr - VR, виртуальная реальность
Программирование
#cpp - C++
#cpu_opt - оптимизации для ЦП
#atomics - атомарные операции, работа с кэшем
#threading - многопоточка
#lockfree - Lock free, wait free алгоритмы
#backend - сервера
#ecs - entity component system
#dod - data oriented design, низкоуровневая оптимизация
Графические API, работа на низком уровне
#gpu_opt - оптимизации для ГПУ
#gapi - все графические API
#vulkan #vk - Vulkan API
#metal - Apple Metal
#opengl #gl - OpenGL
#dx - DirectX 11, 12
Рендеринг
#cg - все что связано с компьютерной графикой
#proc_gen - процедурная генерация
#games - обзор технологий из игр
Другое
#news - новости по теме
#blog - новости по моим разработкам
#hw - все что связано с компьютерным железом
#desktop #win #mac #linux - относится к ПК, ноутбуки
#mobile #android #ios - относится к мобильным платфомам
#vr - VR, виртуальная реальность
Command queues
Моя статья по асинхронным очередям на GPU.
Показаны async compute, ascync transfer очереди для дискретных GPU и только async compute для мобильных.
Демо позволяет покрутить ползунки и увидеть как меняется производительность.
Особенности на Mac M1:
* на
* на
На
#gpu_sync #vk #dx #metal
Моя статья по асинхронным очередям на GPU.
Показаны async compute, ascync transfer очереди для дискретных GPU и только async compute для мобильных.
Демо позволяет покрутить ползунки и увидеть как меняется производительность.
Особенности на Mac M1:
* на
Metal
получается более +25% при использовании Double buffering
, без него не параллелится.* на
MoltenVk
async compute наоборот дает потерю до 10%.Intel GPU
на dx12
поддерживает async compute несмотря на то, что он не поддерживается в железе, и дает до +50%, а на Vulkan
разницы нет, похоже что драйвер на dx12
хорошо эмулирует очереди.На
Android
девайсах так и не получилось распараллелить, хотя для Mali GPU
есть примеры, где получается до +10%.#gpu_sync #vk #dx #metal
Особенность выравнивания типов в шейдерных языках.
float3
float2x2
float3x3
Массивы
В некоторых случаях даже использование HLSL для всех GAPI не помогает и размер данных различается.
Чтобы справиться с плавающим смещением пришлось написать свой генератор структур, где на вход дается структура на одном из языков, а на выход генерируется C++, GLSL, MSL с одинаковыми смещениями.
#vk #metal #blog
float3
GLSL: размер 12, выравнивание 16.
Metal: размер 16, выравнивание 16.
Metal packed_float3: размер 12, выравнивание 4.
float2x2
GLSL std140: размер 32, выравнивание 16, совпадает с float4x2.
GLSL std430: размер 16, выравнивание 8.
Metal: размер 16, выравнивание 8.
float3x3
GLSL std140: размер 48, выравнивание 16, совпадает с float4x3.
GLSL std430: размер 48, выравнивание 16, совпадает с float4x3.
Metal: размер 48, выравнивание 16, совпадает с float4x3.
HLSL (Vk): размер 48, выравнивание 16, совпадает с float4x3.
HLSL (DX): размер 32, выравнивание 4.
Массивы
GLSL std140: минимальное выравнивание 16
GLSL std430: выравнивание совпадает с типом данных
Metal: выравнивание совпадает с типом данных
В некоторых случаях даже использование HLSL для всех GAPI не помогает и размер данных различается.
Чтобы справиться с плавающим смещением пришлось написать свой генератор структур, где на вход дается структура на одном из языков, а на выход генерируется C++, GLSL, MSL с одинаковыми смещениями.
#vk #metal #blog
(video) Transform your geometry with Metal mesh shaders
Mesh shader в Metal.
API не сильно отличается от Vk/DX12, так что портирование не должно вызвать затруднения.
Object shader (task shader в Vk/DX12) проверяет видимость мешлетов и запускает нужное количество меш групп.
Mesh shader генерирует или читает и трансформирует вершины мешлета.
Дальше все как обычно - позиция трансформируется в экранную, нарезаются тайлы и запускается потайловая растеризация.
То есть в отличие от десктопа, где все вершинны всегда в кэше, здесь в любом случае сгенерированные вершины выгружаются в системную память после нарезания на тайлы, чтобы освободить кэш для растеризации тайла.
Все преимущество только в отсечении невидимых мешлетов на ГП и в выборе уровне детализации. Все это можно было сделать и до меш шейдера.
#metal #apple_gpu
Mesh shader в Metal.
API не сильно отличается от Vk/DX12, так что портирование не должно вызвать затруднения.
Object shader (task shader в Vk/DX12) проверяет видимость мешлетов и запускает нужное количество меш групп.
Mesh shader генерирует или читает и трансформирует вершины мешлета.
Дальше все как обычно - позиция трансформируется в экранную, нарезаются тайлы и запускается потайловая растеризация.
То есть в отличие от десктопа, где все вершинны всегда в кэше, здесь в любом случае сгенерированные вершины выгружаются в системную память после нарезания на тайлы, чтобы освободить кэш для растеризации тайла.
Все преимущество только в отсечении невидимых мешлетов на ГП и в выборе уровне детализации. Все это можно было сделать и до меш шейдера.
#metal #apple_gpu
Explore GPU advancements in M3 and A17 Pro
4:39 - Архитектура ГП.
7:09 - Что-то вроде гипертрединга, пока одна группа потоков (SIMDgroup) ждет чтение из памяти, другая группа потоков делает рассчеты на том же ядре. Динамическая память регистров позволяет разместить 2 потока в одном.
11:14 - 3 разных кэша объединили в один большой. Если какой-то кэш не используется, то память не будет простаивать.
14:18 - ГП оптимизированы под вычисления на fp16. Fp32, fp16, int выполняются параллельно, пока между ними нет зависимости (конвертация типов, общая память и тд).
16:54 - Как улучшилась производительность при переносе трассировки лучей в железо. Добавили перераспределение потоков, аналогично SER от NVidia.
23:12 - Перераспределение потоков работает только при использовании
24:50 - Про меш шейдеры. Теперь меньше данных выгружается в ситемную память и больше остается в памяти чипа. Но говорят только про промежуточные данные мешлета, то есть данные между таск и меш шейдером. Тогда как в тайловой архитектуре примитивы еще нарезаются и выгружаются в системную память, похоже эту часть не оптимизировали.
#apple_gpu #metal
4:39 - Архитектура ГП.
7:09 - Что-то вроде гипертрединга, пока одна группа потоков (SIMDgroup) ждет чтение из памяти, другая группа потоков делает рассчеты на том же ядре. Динамическая память регистров позволяет разместить 2 потока в одном.
11:14 - 3 разных кэша объединили в один большой. Если какой-то кэш не используется, то память не будет простаивать.
14:18 - ГП оптимизированы под вычисления на fp16. Fp32, fp16, int выполняются параллельно, пока между ними нет зависимости (конвертация типов, общая память и тд).
16:54 - Как улучшилась производительность при переносе трассировки лучей в железо. Добавили перераспределение потоков, аналогично SER от NVidia.
23:12 - Перераспределение потоков работает только при использовании
intersector<>::intersect()
, и не работает для ray query.24:50 - Про меш шейдеры. Теперь меньше данных выгружается в ситемную память и больше остается в памяти чипа. Но говорят только про промежуточные данные мешлета, то есть данные между таск и меш шейдером. Тогда как в тайловой архитектуре примитивы еще нарезаются и выгружаются в системную память, похоже эту часть не оптимизировали.
#apple_gpu #metal