Практика використання інструментів Vulkan API для підвищення продуктивності програмного забезпечення

Вивчення особливостей використання методик для підвищення продуктивності роботи програмного забезпечення, направленого на роботу з графічними процесорами за допомогою Vulkan API. Здійснення синхронізації роботи центрального та графічного процесорів.

Рубрика Программирование, компьютеры и кибернетика
Вид статья
Язык украинский
Дата добавления 28.03.2024
Размер файла 105,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Національний технічний університет "Київський політехнічний інститут імені Ігоря Сікорського",

ПРАКТИКА ВИКОРИСТАННЯ ІНСТРУМЕНТІВ VULKAN API ДЛЯ ПІДВИЩЕННЯ ПРОДУКТИВНОСТІ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ

Новіков Олександр Олегович здобувач вищої освіти

факультету прикладної математики

Науковий керівник: Коляда Костянтин Вячеславович

канд.техн.наук, ст. викладач

Анотація

Vulkan - це API для роботи з графічним процесором, який прийшов на заміну OpenGL. Він краще підходить для сучасних архітектур графічних процесорів і створює нові підходи для роботи з графічним процесором. Vulkan дає інженерам більше контролю над графічним процесором та взаємодією графічного процесору з центральним процесором. Але це може призвести до неоптимального використання інструментів Vulkan. В цій статті описані методики для підвищення продуктивності роботи програмного забезпечення, направленого на роботу з графічними процесорами за допомогою Vulkan API.

Ключові слова: Vulkan, графічний процесор, комп'ютерна графіка, GPU, рендеринг

Вступ

Vulkan - це сучасний низькорівневий API для роботи з графічним процесором. Він прийшов на заміну OpenGL і має велику кількість відмінностей в порівнянні із своїм попередником. Vulkan надає інструменти для того щоб контролювати пам'ять графічного процесору, синхронізувати команди, які виконуються на графічному процесорі, тощо. Це дає інженерам можливість підлаштовувати графічний процесор для виконання заданої задачі. Але при цьому така свобода може призвести до неоптимального використання інструментів, що були надані Vulkan. Нами описані практики, тестування яких проводилось на мобільному пристрої, і які можуть допомогти збільшити продуктивність програмного забезпечення.

Кешування графічного конвеєру

Vulkan надає можливість зберегти схему графічного конвеєру для подальшого її використання в пришвидшенні створення аналогічного графічного конвеєру [1]. Що можна використати для пришвидшення роботи програмного забезпечення.

Для створення графічного конвеєру в Vulkan, для початку, необхідно скомпілювати шейдери (VkShaderModule). Це має великий вплив на час побудови кадру, якщо говорити про створення зображення в реальному часі. Використання кешування надає можливість пришвидшити створення графічного конвеєру, що в свою чергу зменшить час необхідний для побудови кадру.

Vulkan має VkPipelineCache-об'єкт, який може бути використаний при створені графічного конвеєру за допомогою, наприклад, vkCreateGraphicsPipelines. Цей об'єкт є хешованим контейнером в якому зберігається необхідна інформація про графічний конвеєр.

Vulkan також надає можливість отримати бінарну інформацію VkPipelineCache-об'єкту та зберегти її у файл на диску. Це дає можливість використати цю інформацію при наступних роботах програмного забезпечення.

Тестування на графічному процесорі Mali G76 показують, що використання кешування зменшує час створення pipeline приблизно у два рази. Без використання збереженого кешованого pipeline, час на створення pipeline становить 50.4 мс. А при використанні кешування - 24.7 мс.

Менеджмент VkDescriptorSet та буферів

Для побудови програмного забезпечення, яке використовує Vulkan API, необхідно реалізовувати систему для менеджменту VkDescriptorPool та VkDescriptorSet. VkDescriptorSet використовується для передачі інформації на GPU.

Для відтворення динамічних об'єктів необхідно передавати інформацію про них на GPU. Для цього необхідно створювати буфер, записувати в нього цю інформацію та налаштовувати VkDescriptorSet, який буде вказувати на цей буфер. Матеріали також потребують у використанні VkDescriptorSet для вказування на текстуру, яку вони використовують. При комплексних програмах, кількість VkDescriptorSet є значною. При цьому VkDescriptoSet повинні змінюватися, в залежності від текстур, об'єктів на сцені, тощо.

Для вирішення проблеми зміни VkDescriptorSet можна створити по одному або більше VkDecsriptorPool для кадру. Оновлювати їх на початку обчислення кожного кадру та створювати необхідні VkDescriptorSet з цього VkDescriptorPool. Цей підхід буде використовувати виклики vkResetDescriptorPool на початку обчислення кадру, а vkAllocateDescriptorSets та vkUpdateDescriptorSets для заповнення інформацією [2].

Виклики цих функцій можуть перевантажити CPU. Навіть створити ситуацію в якій оновлення VkDescriptorSet буде відбуватися довше ніж саме обчислення кадру. При тестування такого підходу на графічному процесорі Mali G76 час на відмалювання кадру становить 43.2 мс.

Для вирішення цієї проблеми потрібно побудувати систему кешування. Це надає можливість перевикористовувати вже створені VkDescriptorSet. Система кешування може бути різною. Наприклад, хештаблиця, де буфери та картинки, на які взакує VkDescriptorSet, є ключами таблиці [2]. Такий підхід сильно пришвидшує обчислення кадру. При використанні хештаблиці, час за який обчислюється кадр, зменшився то 27 мс. Але оскільки VkDescriptorPool не очищується при кожному кадрі, для великих динамічних сцен необхідно реалізовувати систему, яка буде відслідковувати descriptor set, що довго не використовуються, та видаляти їх.

Альтернативним підходом до кешування VkDescriptorSet є правильний менеджмент буферів. Замість того, щоб створювати буфер для кожного об'єкту, можна створити буфер і записати в нього інформацію про всі схожі між собою об'єкти. Це зменшить кількість VkDescriptorSet і, відповідно, зменшить виклики vkUpdateDescriptorSets та vkAllocateDescriptorSets. Тестування дає такі ж самі результати як і кешування.

Також має сенс об'єднати кешування та менеджмент в буфері. Це може дати певний результат на великих комплексних сценах.

Використання VkSubpass

Унікальним інструментом для Vulkan є VkSubpass. VkSubpass дає можливість поділити VkRenderPass на окремі логічні частини. Використання subpass замість render pass дає можливість GPU виконувати оптимізації [1].

Перевагу викорстання VkSubpass можна побачити на прикладі Deferred Rendering. Ідея якого полягає у поділенні побудови кадру на дві частини: обчислення геометрії та обчислення освітлення. На етапі обчислення геометрії будується так званий G-буфер. В цей буфер може бути записана різна інформація: глибина, нормалі, позиція, тощо. На другом етапі за допомогою інформації з G-буферу, виконується обчислення того як освітлення впливає на об'єкти, що разтошовані на сцені [3].

Описані етапи обчислення кадру можна поділити двома способами. Або створити два окремих VkRenderPass та передавати між ними інформацію, тобто G-буфер. Або створити один VkRenderPass, який складається з двох VkSubpass. Різниця між цими двома підходами видна в кількості інформації, що передається між різними рівнями пам'яті комп'ютерної системи. У першому випадку інформація зчитується зі швидкістю 2905 MiB на секунду. Записується - зі 2289 MiB на секунду. У другому випадку - зі 825 MiB та 788 MiB на секунду. Така різниця є особливо критичною на мобільних пристроях, оскільки передача інформації є енергозатратною операцією.

Pipeline Barriers

В Vulkan команди які виконуються на GPU мають декілька стадій, що частково відображено на рис. 1 [1]. Для синхронізації спільних ресурсів, які використовують ці команди, в Vulkan використовується так звані бар'єри графічного конвеєру. Бар'єри поділяються на три типи в залежності від типу ресурсів з якими вони працюють: VkMemoryBarrier, VkBufferMemoryBarrier та VkImageMemoryBarrier.

Додавання бар'єру при записі команди встановлює залежність між усіма командами записаними до цього та командами після бар'єру.

Для прикладу роботи бар'єрів знову візьмемо Deferred Rendering з двома Render Pass. В першому VkRenderPass записується інформація в G-буфер. У другому інформація зчитується з G-буферу для обчислення кінцевого вигляду кадру. Це є критичною точкою, тому необхідно реалізувати синхронізацію.

Рис. 1 Стадії графічного конвеєру

Простим рішенням буде дуже строгий бар'єр - ALL_GRAPHICS_BIT або ALL_COMMANDS_BIT. Але це призведе до того, що обчислювальні ресурси GPU буду простоювати.

Інформація з G-буферу використовуються у фрагментному шейдері. Тому кращим бар'єром у цьому випадку буде той, що очікує на етапі фрагментного шейдеру, поки буде виконано запис в G-буфер. Такий бар'єр буде мати вигляд COLOR_ATTACHMENT_OUTPUT_BIT - FRAGMENT_SHADER_BIT. Цей бар'єр надає можливість паралельно обчислювати фрагментний шейдер з першого проходу та вершиний шейдер з другого проходу.

При бар'єрі BOTTOM_OF_PIPE_BIT - TOP_OF_PIPE_BIT час на відтворення кадру становить 31.6 мс. Такий бар'єр блокує можливість виконувати фрагментний та вершинный шейдер одночасно.

Другий випадок, коли бар'єр COLOR_ATTACHMENT_OUTPUT_BIT - VERTEX_SHADER_BIT. Це вважається стандартним бар'єром, який дає змогу впевнитися, що ресурси з першого проходу готові до використання у другому. Тут час становить 31.8 мс. Тобто час не змінився з попереднього прикладу, оскільки в даному випадку обчислювання не відбуваються у вершиному шейдері другого проходу. Оскільки у випадку Deferred Rendering обчислення відбуваються в фрагментному шейдері, то оптимальним бар'єром є COLOR_ATTACHMENT_OUTPUT_BIT - FRAGMENT_SHADER_BIT. В цьому випадку час обчислення кадру станови 27.3 мс.

процесор програмний забезпечення графічний

Синхронізація роботи центрального та графічного процесорів

Простим методом синхронізації CPU та GPU є використання vkQueueWaitIdle або vkDeviceWaitIdle. Ці команди очікують поки пристрій або черга на пристрої закінчать виконання всіх команд. Хоча цей метод є надійним, але він призводить до появи етапів коли GPU простоює. Припиняється паралельне виконання вершиного та фрагментного етапів графічного конвеєру для різних кадрів. Це призводить до збільшення часу необхідного для обчислення кадру.

Альтернативою є використання VkFence об'єктів. Вони створенні якраз для повідомлення CPU, що GPU готовий до отримання наступних команд. Цей підхід позбавляє проблеми простоювання GPU, оскільки CPU знає коли необхідно відправляти команди, необхідні для обчислення наступного кадру.

Тестування було проведено на двох прикладах. В першому використовується vkDeviceWaitIdle перед початком кожного нового кадру. Це змушує GPU закінчити повність усю роботу перед початком наступного кадру. Що призводить до простоювання ресурсів GPU. При такому підході час, затрачений на обчислення кадру, становить 70.2 мс. У другому випадку використовується Fence, а час становить 56 мс.

Список використаних джерел

1. Vulkan Specification. Вилучено з https://registry.khronos.org/vulkan/specsZ1.3extensions/html/vkspec.html

2. Arm Developer. Best Practices. Вилучено з https://developer.arm.com/documentation/101897/0301 /Optimizing-applicationlogic/Vulkan-GPU-pipelining

3. Eric Haines, Naty Hoffman, Tomas Moller (2019). Real-Time Rendering Third Edition

Размещено на Allbest.ru

...

Подобные документы

  • Причини незаконного використання програмного забезпечення. Дослідження збитку, нанесеного комп'ютерним піратством. Ризик роботи з нелегальним програмним забезпеченням і гідності ліцензійних програм. Види захисту прав виробників програмного забезпечення.

    реферат [60,8 K], добавлен 01.06.2010

  • Оцінювання та засоби підвищення надійності інформаційних технологій протягом усього життєвого циклу програмного забезпечення на основі негомогенного пуасонівського процесу та обчислення її параметрів, з урахуванням сучасних тенденцій тестування.

    автореферат [52,0 K], добавлен 10.12.2010

  • Проектування і реалізація навчального програмного продукту "Побудова геометричних фігур". Використання C++ Builder 6 у якості програмного середовища для реалізації даної навчальної програми. Інструкція з використання розробленого програмного забезпечення.

    курсовая работа [2,2 M], добавлен 05.05.2014

  • Визначення вимог до програмного забезпечення. Проектування архітектури програми, структури даних та інтерфейсу. Програмування графічного редактора, специфікація його класів та алгоритм роботи. Зміна архітектури редактора згідно нових вимог замовника.

    дипломная работа [1,2 M], добавлен 05.01.2014

  • Автоматизація роботи диспетчера швидкої допомоги. Забезпечення контролю, обігу документів та створення карток хворих при занесенні інформації бригад швидкої допомоги за допомогою програмного забезпечення. Захист системи від несанкціонованого доступу.

    курсовая работа [1,4 M], добавлен 14.09.2014

  • Основні поняття щодо захисту програмного забезпечення. Класифікація засобів дослідження програмного коду: відладчики, дизасемблери, діскомпілятори, трасировщики та слідкуючі системи. Способи вбудовування захисних механізмів в програмне забезпечення.

    курсовая работа [41,7 K], добавлен 14.11.2010

  • Аналіз сучасних методів та технологій проектування програмного забезпечення. Вибір цільової мобільної платформи. Розробка екранних форм, діаграми класів. Вимоги до програмного продукту. Аналіз небезпечних факторів у відділі роботи з фізичними особами.

    дипломная работа [508,1 K], добавлен 02.12.2015

  • Створення одночасного режиму роботи декількох відеокарт. Історія розвитку інтерфейсу взаємодії відеокарти та материнської плати. Технологія збільшення продуктивності відео AMD CrossFireX. Використання спеціалізованих рішень для промислових додатків.

    курсовая работа [6,7 M], добавлен 03.01.2016

  • Створення одночасного режиму роботи декількох відеокарт. Розвиток інтерфейсу взаємодії відеокарти та материнської плати. Технологія збільшення продуктивності відео AMD CrossFireX та NVIDIA SLI. Використання спеціалізованих рішень для промислових додатків.

    курсовая работа [3,5 M], добавлен 09.01.2016

  • Аналіз методів емпіричної інженерії програмного забезпечення. Призначення та властивості програмного забезпечення та метрик проектів Openproj-1.4-src, TalendOpen Studio 3.2.1 та Рlazma-source 0.1.8, їх статистичний, кореляційний та регресійний аналіз.

    курсовая работа [2,7 M], добавлен 12.12.2010

  • Теоретичні відомості щодо головних принципів локалізації програмного забезпечення, основні технологічні способи його здійснення. Труднощі, пов`язані з цим процесом. Перекладацький аналіз україномовної локалізації програм XnView і VSO Image Resizer.

    дипломная работа [1,0 M], добавлен 16.07.2013

  • Дослідження алгоритму роботи та коду програми. Оцінка методом "чорного ящика". Тестування і налагодження розробленої програми на алгоритмічній мові високого рівня. Оцінювання якості програмного забезпечення за об’єктно-орієнтованими метриками зв’язності.

    курсовая работа [143,1 K], добавлен 11.03.2021

  • Переваги використання відкритої архітектури програмного забезпечення ВВК. Концепція побудови лабораторного практикуму. Структура та взаємодія програмних та апаратних засобів. Структурна схема розподілу ресурсів мікроконтролера між приладами.

    реферат [1,9 M], добавлен 06.07.2009

  • Опис підрозділу гнучких виробничих систем (ГВС) як об‘єкта управління. Проектування алгоритмічного забезпечення системи оперативного управління. Складання розкладу роботи технологічного обладнання. Розробка програмного забезпечення підсистем СОУ ГВС.

    курсовая работа [2,0 M], добавлен 11.07.2012

  • Етапи розробки проекту. Вимоги до апаратного і програмного забезпечення, до користувача. Специфікація та структура даних, які мають бути розміщеними в системі. Вигляд інтерфейсу системи програмного забезпечення. Розробка бази даних косметичного салону.

    дипломная работа [1,8 M], добавлен 21.02.2015

  • Аналіз технічного забезпечення, вибір інструментального програмного забезпечення та середовища розробки програм. Створення класів для реалізації необхідних функцій для роботи програмного засобу. Розробка інтерфейсу для користувача та лістинг програми.

    курсовая работа [343,9 K], добавлен 24.08.2012

  • Реалізація механізму роботи пекарні за допомогою засобів UML, а саме використання програмного продукту Rational Rose (об’єктно-орієнтованого засобу проектування). Проект автоматизованої моделі цього виробництва за допомогою AllFusion Process Modeler.

    курсовая работа [189,1 K], добавлен 28.04.2011

  • Аналіз формування податкової звітності. Розробка проекту інтерфейсу, інформаційної, статичної та динамічної моделей програмного забезпечення. Розрахунок економічної ефективності впровадження програмного забезпечення формування податкової звітності.

    дипломная работа [3,5 M], добавлен 26.04.2012

  • Планування програмного забезпечення автоматизованої системи бюро працевлаштування. Накопичення даних стосовно ринку праці. Проектування статичних аспектів, поведінки та архітектури програмного забезпечення. Особливості функціонування програмного продукту.

    курсовая работа [184,5 K], добавлен 05.07.2015

  • Проблеми розробки компонентного програмного забезпечення автоматизованих систем управління. Сучасні компонентні технології обробки інформації. Аналіз вибраного середовища проектування програмного забезпечення: мова програмування PHP та Apache HTTP-сервер.

    дипломная работа [2,8 M], добавлен 11.05.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.