понедельник, 29 апреля 2019 г.

Производительность некоторых операций на Vulkan

Просто проверка теории на практике.
Исходники тестов тут: GenMipmapsClearImage
Теория тут: Framebuffer compressionDelta color compression


Самая быстрая генерация мип уровней.
В начале всех тестов создается текстура с шумом, потом для нее генерируются мип уровни.

Первая текстура записывается в компьют шейдере
mipmap generation using render pass: 0.38 ms
mipmap generation using image blit: 0.38 ms
mipmap generation using optimal image blit: 0.38 ms
mipmap generation using compute shader: 0.91 ms

Первая текстура записывается в фрагментном шейдере
mipmap generation using render pass: 0.16 ms
mipmap generation using image blit: 0.16 ms
mipmap generation using optimal image blit: 0.16 ms
mipmap generation using compute shader: 0.88 ms

Вариант с f32 текстурой, исходная текстура создается в фрагментном шейдере.
mipmap generation using render pass: 0.54 ms
mipmap generation using image blit: 0.55 ms
mipmap generation using optimal image blit: 0.54 ms
mipmap generation using compute shader: 1.44 ms

Выводы:
1. при рендере в текстуру используется хардварное сжатие и далее идет чтение сжатой текстуры с хардварной билинейной фильтрацией, что увеличивает пропускную способность памяти и производительность в целом.
2. блиттинг сделан также как и рендер, поэтому разницы в производительности нет.
3. разница между general и transfer_optimal лейаутами минимальна (всего 1.8%).
4. генерация 5-ти мип уровней в компьют шейдере хоть и дает прирост производительности, но все равно медленее других способов.
5. использование general layout для рендера в текстуру и чтения из нее никак не влияет на производительность.


Самая быстрая очистка текстуры.
В начале всех тестов создается текстура с шумом, потом очищается разными способами.

Генерация в фрагментном шейдере, очистка белым цветом, размер 16к х 16к.
clear image using render pass: 0.23 ms
clear image using transfer op: 0.23 ms
clear image using optimal transfer op: 0.23 ms
clear image using compute shader: 24.95 ms

То же самое, только очистка случайным цветом.
clear image using render pass: 0.64 ms
clear image using transfer op: 0.62 ms
clear image using optimal transfer op: 0.60 ms
clear image using compute shader: 25.02 ms

Генерация в компьют шейдере, очистка случайным цветом.
clear image using render pass: 0.61 ms
clear image using transfer op: 0.66 ms
clear image using optimal transfer op: 0.65 ms
clear image using compute shader: 4.79 ms

Выводы:
1. за счет хардварного сжатия очистка некоторыми стандартными значениями работает почти в 3 раза быстрее.
2. нет разницы между очисткой в пустом рендер пассе и через vkCmdClearColorImage.
3. использование undefined layout между генерацией текстуры в фрагментном шейдере и очисткой никак не влияет на производительность, либо драйвер сам отбрасывает предыдущие данные без декомпрессии, либо декомпрессия происходит всегда.
4. переход graphics -> compute очень медленный, возможно из-за декомпрессии текстуры.
5. переход compute -> graphics и compute -> transfer не влияют на производительность.

Комментариев нет:

Отправить комментарий