Vulkan
Jak działa
Vulkan udostępnia GPU przez jawne obiekty: instancje, urządzenia fizyczne i logiczne, kolejki, bufory poleceń, potoki (pipeline) oraz descriptor sets wiążące zasoby. Programista sam zarządza pamięcią i synchronizacją (bariery, semafory, fence), co daje niski narzut i przewidywalną wydajność kosztem większej złożoności niż w starszych API. Do obliczeń ogólnego przeznaczenia służą compute shadery pisane zwykle w GLSL/HLSL i kompilowane do pośredniej reprezentacji SPIR-V, uruchamiane w grupach roboczych (workgroups) masowo równolegle. W AI wykorzystuje się to do implementacji jąder (mnożenie macierzy, kwantyzowane kernele) niezależnych od producenta GPU; np. backend Vulkan w llama.cpp pozwala uruchamiać inferencję LLM na kartach AMD, Intel i NVIDIA bez CUDA. Na platformach Apple Vulkan działa przez warstwę tłumaczącą MoltenVK na Metal.
Rozwiązany problem
Akceleracja AI na GPU była długo uzależniona od zamkniętych, związanych z producentem stosów (przede wszystkim CUDA na NVIDIA), co utrudniało przenośność na sprzęt AMD, Intel czy układów mobilnych. Vulkan rozwiązuje to jako otwarty, niezależny od dostawcy standard: jeden zestaw compute shaderów może działać na GPU różnych producentów i systemów (Windows, Linux, Android, a przez MoltenVK także macOS/iOS), dając jednocześnie niski narzut sterownika i jawną, wielowątkową kontrolę nad harmonogramowaniem pracy GPU.
Kluczowe mechanizmy
Mocne strony i ograniczenia
Komponenty
Programy obliczeń ogólnego przeznaczenia uruchamiane w grupach roboczych na GPU, używane do implementacji jąder AI niezależnych od producenta.
Przenośny, binarny format pośredni, do którego kompiluje się shadery (z GLSL/HLSL), umożliwiając ich uruchamianie na różnych sterownikach.
Bufory poleceń, kolejki, bariery, semafory i fence dające programiście pełną, wielowątkową kontrolę nad pracą i pamięcią GPU przy niskim narzucie.
Implementacja
Jawne zarządzanie pamięcią i synchronizacja czyni Vulkan trudniejszym i bardziej podatnym na błędy niż wyżej poziomowe API.
Wydajność i kompletność implementacji zależą od sterownika producenta; te same shadery mogą działać różnie na GPU różnych marek.
Ewolucja
Vulkan 1.0 debiutuje jako następca OpenGL: otwarty, niskonarzutowy, wieloplatformowy standard grafiki i obliczeń.
Kolejne wersje rozwijają compute shadery, subgroups i interoperacyjność, umacniając Vulkan jako platformę GPGPU.
llama.cpp zyskuje backend Vulkan, umożliwiając inferencję LLM na GPU AMD, Intel i NVIDIA bez CUDA, co upowszechnia Vulkan w lokalnym AI.
Hiperparametry (konfigurowalne osie)
Liczba wątków w grupie roboczej compute shadera, wpływająca na wykorzystanie GPU.
Rozmiar podgrupy (warp/wavefront) wykorzystywanej w operacjach subgroup dla wydajności.
GPU i sterownik, dla którego kompiluje się i optymalizuje shadery SPIR-V.
Złożoność obliczeniowa
Złożoność czasowa: Zależna od jądra (np. O(N^2 d) dla uwagi) — Vulkan to warstwa wykonania. Złożoność przestrzenna: Ograniczona pamięcią GPU (VRAM) urządzenia docelowego.
Backend Vulkan w llama.cpp umożliwia inferencję LLM na szerokiej gamie GPU (AMD, Intel Arc, NVIDIA) bez CUDA/ROCm, co jest kluczowe na sprzęcie, gdzie stosy producenckie są niedostępne lub niedojrzałe. Wydajność bywa niższa niż natywnej CUDA na kartach NVIDIA, ale przenośność czyni Vulkan atrakcyjnym uniwersalnym backendem, zwłaszcza dla GPU Intel i AMD w lokalnej inferencji.
Wąskie gardło obliczeniowe
Wydajność Vulkan zależy od implementacji sterownika danego producenta oraz optymalizacji compute shaderów; sam standard ma niski narzut.
Paradygmat wykonania
Wzorzec aktywacji wyznacza uruchamiany model/jądro, nie samo API Vulkan.
Vulkan to API wykonania compute shaderów; nie narzuca routingu ani warunkowej aktywacji (te wynikają z modelu).
Równoległość
Compute shadery Vulkan wykonują się masowo równolegle w grupach roboczych; stopień równoległości zależy od jądra i GPU.
Wymagania sprzętowe
Vulkan działa na GPU wszystkich głównych producentów (AMD, NVIDIA, Intel, ARM Mali), udostępniając ich jednostki obliczeniowe przez compute shadery.
Jako otwarty standard Khronos Vulkan jest przenośny między systemami i sprzętem; na Apple działa przez warstwę MoltenVK tłumaczącą na Metal.