„Vulkan“ ir „Vulkan Compute“ skirtumai, skirti GPGPU ir grafikai

Paskutiniai pakeitimai: 04/12/2025
Autorius: Izaokas
  • „Vulkan“ yra žemo lygio, kelių platformų API, kuri sujungia 3D grafiką ir bendruosius skaičiavimus, naudodama skaičiavimo šešėliavimo įrankius viename atminties modelyje, eiles ir sinchronizavimą.
  • Palyginti su „OpenGL“ ir „DirectX 11“, „Vulkan“ smarkiai sumažina tvarkyklių apkrovą, geriau veikia kelių branduolių procesoriuose ir naudoja SPIR-V iš anksto kompiliuotiems šešėliavimo įrenginiams.
  • Palyginti su CUDA, „Vulkan“ siūlo mažiau specializuotą, bet daug mobilesnį GPGPU skaičiavimą, suderinamą su skirtingais gamintojais ir operacinėmis sistemomis.
  • Pasirinkimas tarp „Vulkan Compute“, „OpenGL“, „DirectX“ arba „CUDA“ priklauso nuo našumo, sudėtingumo, tikslinių platformų ir poreikio integruoti grafiką ir skaičiavimus į vieną kanalą pusiausvyros.

gpgpu

Kai pradedate eksperimentuoti su GPU skaičiavimais, normalu susipainioti tarp visų API: OpenGL, Vulkan, DirectX, CUDA... ir, kalbant apie Vulkan, išgirsti, kad „Vulkan Compute“ yra kažkas atskiro. Jei galvojate apie modeliavimo, fizikos, dirbtinio intelekto ar bet kurios GPGPU užduoties įgyvendinimą, norint pasirinkti tinkamą kelią, labai svarbu suprasti skirtumus tarp grafikos pagrindu sukurto „Vulkan“ ir jo naudojimo kaip skaičiavimo API .

Iš esmės „Vulkan“ yra tik viena API, tačiau ją galima naudoti kaip tradicinę grafikos API arba kaip bendrosios paskirties skaičiavimo API, panaudojant jos skaičiavimo šešėliavimo įrankius. Panagrinėkime atidžiau, kuo ji skiriasi nuo „OpenGL“, kuo ji skiriasi nuo „CUDA“ ir kaip visa tai dera su likusia šiuolaikine API ekosistema, pvz., „DirectX“ ar net „OpenCL“.

Kas yra „Vulkan“ ir kaip atrodo „Vulkan Compute“?

vulkanas

„Vulkan“ yra žemo lygio API , sukurta ir prižiūrima „Khronos Group“ kaip senesnės „OpenGL“ ir „Mantle“ (AMD) filosofijos evoliucija. Ji buvo pristatyta 2016 m. kaip moderni 3D grafikos ir bendrosios paskirties GPU skaičiavimo API, turinti du labai aiškius tikslus: maksimaliai padidinti aparatinės įrangos našumą ir būti tikrai kelių platformų pagrindu.

Kitaip nei „OpenGL“, kuris vystėsi dėl plėtinių ir pataisų, „Vulkan“ buvo sukurtas nuo nulio daugiabranduoliams procesoriams, šiuolaikinėms vaizdo plokštėms ir įrenginiams – nuo ​​stalinių kompiuterių iki mobiliųjų telefonų ir konsolių. Jis labai remiasi idėja, kad kūrėjas tvarko didžiąją dalį išteklių valdymo ir sinchronizavimo, o tai žymiai sumažina tvarkyklių apkrovą.

Kalbėdami apie „Vulkan Compute“, iš tikrųjų turime omenyje skaičiavimo šešėliavimo įrankių naudojimą „Vulkan“ sistemoje GPGPU užduotims atlikti: modeliavimui, vaizdų apdorojimui, dalelių fizikai, pažangiam tolesniam apdorojimui, dirbtiniam intelektui ir pan. Nėra atskiros API, vadinamos tokiu; veikiau yra vieningas modelis, kuriame grafika ir skaičiavimo šešėliavimo įrankiai naudoja tą pačią ekosistemą: tą pačią deskriptorių sistemą, tą pačią komandų eilę , tą pačią atmintį ir tuos pačius sinchronizavimo įrankius.

Šis suvienodintas metodas leidžia vienam varikliui arba programai tvarkyti vaizdavimą ir skaičiavimą naudojant tą pačią API , nereikalaujant, pavyzdžiui, maišyti „OpenGL“ grafikai ir kitą atskirą skaičiavimo API bendram GPU darbui.

Nuo OpenGL iki Vulkan: šuolis skaičiavimo šešėliavimo srityje

„OpenGL“ prieš daugelį metų įtraukė skaičiavimo šešėliavimo įrankius (angl. computing shaders) , todėl GPGPU buvo gana patogus daugeliui užduočių atlikti. Tačiau jo konstrukcija apima globalią būsenų mašiną (angl. global state machine) , stiprią priklausomybę nuo vieno konteksto ir papildomas apkrovas dėl patvirtinimų, netiesioginių užraktų ir paslėptos sinchronizacijos, kurios ne visada gerai pritaikomos daugiabranduoliuose procesoriuose.

„OpenGL“ kalboje didžioji API būsenos dalis yra susieta su globaliu kontekstu: iškvietimai atliekami nuosekliai , o tvarkyklė už jus priima daug „stebuklingų“ sprendimų. Tai gali veikti mažai programai ar demonstracinei versijai, bet kai norite iš tikrųjų lygiagretinti, išnaudoti visus procesoriaus branduolius ir sukurti gerai optimizuotas darbo eiles, šis metodas yra nepakankamas.

„Vulkan“ laužo šį modelį ir yra pagrįstas objektais be globalios būsenos . Užuot iškvietus funkcijas, kurios keičia globalią būseną, „Vulkan“ programoje sukuriate komandų buferius, kuriuose tiksliai aprašote, ką norite vykdyti: kokius išteklius naudoti, kuriuos šešėliavimo įrankius paleisti, kaip sinchronizuoti ir pan. Šias komandas galima generuoti lygiagrečiai iš kelių gijų ir labai efektyviai siųsti į GPU.

Tai turi aiškią pasekmę: palyginti su „OpenGL“, „Vulkan“ leidžia daug geriau išnaudoti kelių branduolių procesorius . „Vulkan“ skaičiavimo šešėliavimo programos gali būti paruoštos ir siunčiamos iš kelių gijų, tvarkyklei netapant kliūtimi. Todėl atliekant labai sudėtingas užduotis arba atliekant daug mažų darbų, „Vulkan“ dažnai pranoksta „OpenGL“ tiesiog sumažindamas procesoriaus apkrovą ir leisdamas geriau paskirstyti apkrovą.

  5 geriausios komiksų piešimo programos

Kitas svarbus skirtumas slypi šešėliavimo įrankiuose: „OpenGL“ naudoja aukšto lygio GLSL , ir kiekviena tvarkyklė turi turėti savo kompiliatorių, kuris vykdymo metu verčia šaltinio kodą į GPU dvejetainį failą. Tai apsunkina tvarkyklių priežiūrą ir gali lemti skirtingą skirtingų gamintojų veikimą.

„Vulkan“ taiko panašų metodą kaip ir „Direct3D“: šešėliavimo programos nėra pateikiamos kaip tekstas, o standartiniu dvejetainiu tarpiniu formatu, vadinamu SPIR-V . Šešėliavimo programas galite sukompiliuoti vieną kartą (pavyzdžiui, iš GLSL arba HLSL į SPIR-V dvejetainį failą), o tada tvarkyklei tereikia atlikti galutinį optimizavimą. Tai pagerina įkėlimo laiką , sumažina kompiliavimo klaidas vykdymo metu ir palengvina daugelio skirtingų šešėliavimo programų naudojimą toje pačioje scenoje arba skaičiavimo sraute.

Našumo skirtumai: „OpenGL Compute“ ir „Vulkan Compute“

Grynai iš GPU perspektyvos skaičiavimo šešėliavimo įrankyje veikiantis skaičiavimo kodas gali būti labai panašus, nesvarbu, ar jis rašomas „OpenGL“, ar „Vulkan“. Tačiau bendras programos našumas priklauso ne tik nuo to, ką vykdo GPU, bet ir nuo to, kaip tiekiate duomenis GPU iš CPU ir kaip sinchronizuojate bei bendrinate duomenis.

Naudodami „Vulkan“, galite pašalinti didelę dalį tvarkyklių apkrovos , aiškiai naudoti komandų eiles, grupuoti daugybę operacijų į paketus, rankiniu būdu valdyti atmintį ir išvengti globalių būsenų, kurios blokuoja lygiagretumą. Visa tai reiškia, kad praktiškai ta pati simuliacija ar bendras skaičiavimas „Vulkan“ aplinkoje paprastai veikia geriau nei „OpenGL“, ypač scenarijuose su daugybe gijų ar daug mažų užduočių.

Realaus pasaulio programose panašūs skirtumai pastebėti ir grynai grafikoje: naudojant identišką aparatinę įrangą ir tokioje aplinkoje kaip „Windows 7“ , „Vulkan“ tam tikruose etaloniniuose testuose pasiekė apie 303 kadrus per sekundę, palyginti su maždaug 270 kadrų per sekundę greičiu naudojant kitą, tradiciškesnę API, būtent dėl ​​​​šio pridėtinių išlaidų sumažėjimo ir geresnio procesoriaus / grafikos procesoriaus apkrovos paskirstymo.

Be to, „Vulkan“ daug geriau prisitaiko prie kelių branduolių procesorių . „OpenGL 4“ ir „DirectX 11“ iš pradžių buvo sukurti vieno branduolio procesoriams ir gavo plėtinius, kad veiktų su keliais branduoliais, tačiau jų modelis nėra taip gerai prisitaikantis. Kita vertus, „Vulkan“ buvo sukurtas atsižvelgiant į šią realybę nuo nulio, todėl lygiagretus darbo paruošimas GPU yra natūrali API dalis, o ne priedas.

„Vulkan“ ir „DirectX“: šiuolaikinės žemo lygio API sąsajos

Norint „Vulkan Compute“ pateikti bendrą žemėlapį, verta jį palyginti su išsamiu „Vulkan“, „DirectX“ ir „OpenGL“ palyginimu , ypač su „Direct3D 11“ ir „12“, kurie vis dar yra etalonas kuriant vaizdo žaidimus, skirtus „Windows“ ir „Xbox“.

„DirectX“, kurią „Microsoft“ kuria nuo 1995 m., iš tikrųjų yra multimedijos API (grafikos, garso, įvesties ir kt.) rinkinys . „Direct3D“ yra 3D grafikos komponentas, o „Direct3D 11“ API yra aukštesnio lygio: didelę dalį išteklių valdymo, sinchronizavimo ir patvirtinimo logikos automatiškai tvarko tvarkyklė. Tai supaprastina kūrėjams, bet taip pat reiškia daugiau procesoriaus apkrovų ir mažiau tikslinimo.

Išleisdama „Direct3D 12“, „Microsoft“ priartėjo prie „Vulkan“ filosofijos: žemesnio lygio API, aiški kontrolė ir geresnis mastelio keitimas kelių branduolių procesoriuose. Tačiau „DirectX“ yra patentuota technologija, skirta „Microsoft“ ekosistemai : „Windows“ ir „Xbox“ konsolėms. Jei jūsų pagrindinis taikinys yra „Windows“, „DirectX“ turi labai brandžią ekosistemą, išsamią dokumentaciją ir didžiulę bendruomenę. Jei nesate tikri, galite patikrinti, kurią „DirectX“ versiją įdiegėte.

Kita vertus, „Vulkan“ nuo pat pradžių yra kelių platformų platforma . Jis veikia „Linux“ , „Android“ , „BSD Unix“, „Windows“, „Nintendo Switch “ ir kitose platformose, o trečiųjų šalių kūrėjai palaiko „macOS“ ir „iOS“ per suderinamumo sluoksnius. Tai ypač patrauklu studijoms, norinčioms dirbti su keliomis platformomis , įskaitant kompiuterius, mobiliuosius įrenginius ir konsoles.

  Kaip susieti naują nuotolinio valdymo pultą su išmaniuoju televizoriumi

Dar vienas skirtumas: „DirectX“ yra API rinkinys , o „Vulkan“ paprastai apibūdinama kaip naujos kartos , suvienodinta „OpenGL“ / žaidimų programavimo programinė įranga grafikai ir kompiuterijai. „Vulkan“ siūlo labai subalansuotą procesoriaus / grafikos procesoriaus naudojimą ir tapo labai populiari „Android“ ir emuliatorių pasaulyje, o „DirectX“ aiškiai dominuoja „Windows“ sistemoje.

Kalbant apie neapdorotą greitį, dažnai sakoma, kad „Vulkan“ daugeliu atvejų yra greitesnis nei „DirectX“, ypač kai darbas yra gerai paralelizuotas ir išnaudojamas žemo lygio, daugiagijas API pobūdis. „DirectX 12“ tam tikrais atvejais gali jį pranokti ar net pranokti. Norėdami patikrinti suderinamumą, galite patikrinti, ar jūsų GPU palaiko „DirectX 12 Ultimate“.

„Vulkan“ ir „CUDA“ palyginimas grynam GPGPU

Dar vienas svarbus bendrosios paskirties GPU skaičiavimo žaidėjas yra „CUDA“ – „NVIDIA “ platforma . Jei naudojate „CUDA“ ir svarstote apie savo platformos keitimą ar atnaujinimą, labai svarbu suprasti „Vulkan Compute“ privalumus ir trūkumus.

CUDA yra specialiai sukurta moksliniams skaičiavimams, didelio našumo skaičiavimams (HPC), dirbtiniam intelektui, mašininiam mokymuisi ir kitoms daug skaičiavimo reikalaujančioms užduotims. Ji siūlo didžiulę optimizuotų bibliotekų, derinimo įrankių ir profiliavimo galimybių ekosistemą ir yra giliai integruota tiek į akademinę, tiek į superkompiuterių aplinką. C/C++ sintaksė su CUDA plėtiniais yra gana patogi naudoti, jei jau esate susipažinę su ta aplinka.

Kita vertus, „Vulkan“ yra bendrosios paskirties grafikos ir skaičiavimo API . Jos skaičiavimo šešėliavimo programos gali atlikti daugumą to paties funkcijų, kurias atliekate CUDA, tačiau mentalinis modelis skiriasi: dirbate su SPIR-V šešėliavimo programuotojais , aprašų struktūromis, komandų eilėmis ir tiesiogine sinchronizacija. Sintaksė nėra identiška CUDA; paprastai rašote GLSL, HLSL arba kita šaltinio kalba, kurią vėliau kompiliuojate į SPIR-V.

Pagrindinis „Vulkan“ pranašumas, palyginti su „CUDA“, yra tas, kad jis neapsiriboja „NVIDIA“ aparatine įranga . Kaip atviras standartas, pagrįstas „Khronos“, jis veikia su įvairių gamintojų GPU ir daugelyje skirtingų operacinių sistemų: „Linux“, „Android“, „Windows“, „Nintendo“ ir kt. Jei jums reikia, kad jūsų GPGPU programinė įranga veiktų AMD, „Intel“ , mobiliuosiuose įrenginiuose ar konsolėse , „Vulkan“ yra daug lankstesnis sprendimas.

Tačiau „Vulkan“ mokymosi kreivė paprastai yra statesnė nei „CUDA“. Reikia sukurti didelę infrastruktūrą: loginius įrenginius, eiles, buferius, deskriptorius, srautus, rankinį sinchronizavimą ir pan. CUDA sistemoje daugelis šių sluoksnių yra labiau integruoti arba abstrahuoti pačių „NVIDIA“ bibliotekų.

Praktiškai „Vulkan“ idealiai tinka, kai reikia suvienodinti grafiką, skaičiavimus ir diegimą keliose platformose. „CUDA“ puikiai tinka grynam GPGPU NVIDIA ekosistemoje, ypač jei ketinate pasikliauti jos bibliotekų rinkiniu (cuBLAS, cuDNN ir kt.) ir jums nereikia integruoti pažangios grafikos į tą pačią API.

„Vulkan“ ir kitos API bei standartai: „OpenCL“, „Metal“, „Mantle“…

„Vulkan“ nėra vienintelis, konkuruojantis su „OpenGL“, „DirectX“ ir „CUDA“; lygiagrečiųjų skaičiavimų srityje yra ir kitų žaidėjų. Puikus pavyzdys yra „OpenCL“ , taip pat sukurta „Khronos“, kuri jau daugelį metų naudojama bendrosios paskirties lygiagrečiam programavimui keliuose įrenginiuose.

Atsiradus „OpenCL 2.2“, „Khronos“ paskelbė, kad „OpenCL“ kiek įmanoma labiau konverguos į „Vulkan“ , kad „OpenCL“ kodą būtų galima diegti tiek „OpenCL“, tiek „Vulkan“. Šis metodas jau buvo pademonstruotas realiuose produktuose: pavyzdžiui, „Adobe Premiere Rush“ naudoja atvirojo kodo „clspv“ kompiliatorių , kad konvertuotų „OpenCL C“ branduolius į „SPIR-V“ ir paleistų juos „Vulkan“ vykdymo aplinkoje „Android“ sistemoje.

Taip pat yra konkrečioms platformoms skirtų API, tokių kaip „Metal“ („Apple“) ir „Vulkan“ istorinės šaknys slypi „Mantle“ – AMD API, kurios kodas buvo paaukotas „Khronos“, siekiant sukurti žemo lygio, atvirą standartą, panašų į „DirectX 12“, bet veikiantį keliose platformose. „Vulkan“ paveldi daug idėjų iš „Mantle“ ir dalijasi filosofija su „DirectX 12“ ir „Metal“: mažos pridėtinės išlaidos, aiški kontrolė ir dėmesys kelių branduolių procesoriams.

  Kaip visiškai pašalinti CCleaner

„Vulkan“ evoliucija ir dėmesys kompiuterijai

Nuo pirmojo išleidimo 2016 m. „Vulkan“ gavo keletą svarbių atnaujinimų , kurie patobulino tiek grafikos, tiek skaičiavimo šešėliavimo galimybes.

„Vulkan 1.1“ standartizavo plėtinius, tokius kaip kelių peržiūrų režimas, įrenginių grupės, bendrinimas tarp procesų ir API , išplėstinės skaičiavimo funkcijos, patobulintas HLSL suderinamumas ir spalvų formatų, tokių kaip YCbCr, palaikymas. Taip pat buvo pristatytas aiškus kelių GPU palaikymas ir šiuolaikinių metodų, tokių kaip spindulių sekimas, pagrindas , dar labiau priartinant jį prie „DirectX 12“ galimybių.

„Vulkan 1.2“ integravo 23 papildomus plėtinius , kurie plačiai naudojami baziniame standarte. Tarp svarbiausių yra laiko juostos semaforai sinchronizavimui (daug lengviau valdomi sudėtinguose scenarijuose), formalus atminties modelis, tiksliai apibrėžiantis, kaip operacijos sinchronizuojamos skirtinguose gijose, ir deskriptorių indeksavimas , leidžiantis pakartotinai naudoti deskriptorių dizainus su keliais šešėliavimo įrankiais – tai labai naudinga derinant grafiką ir skaičiavimą.

„Vulkan 1.3“ tęsė šią kryptį, taip pat integruodama nemažai plėtinių ir daugiausia dėmesio skirdama fragmentacijos mažinimui . Kad įrenginys būtų paskelbtas suderinamu su „Vulkan 1.3“, tam tikros funkcijos nustoja būti pasirenkamos ir tampa privalomos, todėl kūrėjams lengviau tiksliai žinoti, kokių galimybių jie gali tikėtis. Be to, buvo pridėti dinaminio atvaizdavimo patobulinimai, dinamiškesnės būsenos ir patobulinta sinchronizavimo API – visa tai labai svarbu derinant grafiką su skaičiavimo reikalaujančiomis programomis.

Lygiagrečiai buvo tobulinama ir SPIR-V, išleidžiant tokias versijas kaip 1.3, kuri leidžia išreikšti vis sudėtingesnius šešėliavimo įrankius ir skaičiavimo branduolius, suderinamus su įvairiais aukšto lygio API.

Praktiniai „Vulkan“ privalumai grafikai ir kompiuterijai

„Vulkan“ buvo sukurtas siekiant pasiūlyti keletą aiškių pranašumų, palyginti su ankstesnėmis API, tiek grafikos, tiek bendrųjų skaičiavimų srityse. Vienas akivaizdžiausių yra tvarkyklių apkrovos sumažinimas , o tai reiškia mažesnį procesoriaus apkrovą. Naudodami paketinį apdorojimą ir komandų buferius, galite vienu metu paruošti didelius darbo kiekius GPU.

Dar vienas privalumas – geresnis mastelio keitimas daugiabranduoliuose procesoriuose . „DirectX 11“ ir „OpenGL 4“ atsirado vieno branduolio procesorių eroje ir vėliau buvo patobulintos, kad geriau veiktų su keliais branduoliais, tačiau jų modeliai nėra taip gerai keičiamo mastelio. „Vulkan“ buvo specialiai sukurtas tam, kad kelios gijos galėtų lygiagrečiai ruošti komandas be persidengimo, pasinaudojant daugelio branduolių procesoriais.

Kalbant apie atmintį ir sinchronizavimą, „Vulkan“ suteikia aiškią GPU atminties valdymo ir operacijų sinchronizavimo kontrolę. Tai apsaugo nuo netikėto tvarkyklės elgesio, nors reikalauja daug didesnio atsargumo. Kad tai būtų lengviau, užuot tikrinęs vykdymo laiko klaidas, kaip „OpenGL“, „Vulkan“ atskiria patvirtinimą į kūrimo sluoksnius , kuriuos galite įjungti derinimo metu ir išjungti gamyboje, kad pagerintumėte našumą.

Dar vienas svarbus privalumas yra tas, kad jis suvienodina skaičiavimo branduolių ir grafikos šešėliavimo įrenginių valdymą . Nebereikia naudoti, pavyzdžiui, vienos API grafikai, o kitos – skaičiavimui; tiek atvaizdavimas, tiek GPGPU veikia tame pačiame eilių, atminties ir deskriptorių modelyje. Tai labai supaprastina projektus, kuriuose grafika ir skaičiavimas yra glaudžiai susiję, pavyzdžiui, šiuolaikinius žaidimų variklius, sudėtingus simuliatorius arba virtualios ir papildytos realybės programas.

„Vulkan“, „DirectX“ ir „OpenGL“, skirti „Windows“
Susijęs straipsnis:
Išsamus palyginimas: „Vulkan“, „DirectX“ ir „OpenGL“, skirti „Windows“