ROCm (Radeon Open Compute platform) on Advanced Micro Devices (AMD) tarkvaralahenduste kogum graafikaprotsessori (GPU) programmeerimiseks. See hõlmab mitmeid valdkondi, sealhulgas üldotstarbeline andmetöötlus graafikaprotsessoritel (GPGPU), suure jõudlusega andmetöötlus (HPC) ja heterogeenne andmetöötlus.

ROCm võimaldab kasutada mitmeid erinevaid programmeerimismudeleid: HIP (GPU kernelipõhine programmeerimine), OpenMP liides (MPI) (direktiividepõhine programmeerimine) ja OpenCL (raamistik heterogeensete ehk erinevat tüüpi protsessoreid sisaldavate süsteemide programmeerimiseks).

ROCm kasutatakse nii suure võimsusega andmetöötluses, tehisaru süsteemides, teadusarvutustes ning raalprojekteerimises (CAD). [1]

Taust muuda

AMD (varasemalt ATI) esimene tarkvaralahenduste pakett oli Close to Metal (CTM), millest kasvas välja Stream tarkvaraarenduskomplekt.

CTM andis arendajatele ligipääsu graafikaprotsessori paralleelsete arvutuselementide käsustikule ja mälule. CTM läks mööda graafikakesksetest DirectX ja OpenGL rakendusliidestest ning lasi arendajatel vahetult kontrollida stream-protsessorite, aritmeetika-loogika elementide ning mälukontrollerite tööd. CTM järglane Stream toodi turule 2007. aastal. Stream sisaldas ka kõrgema tasema tööriistu utiliseerimaks AMD graafikaprotsessorite riistvara.

2008. aastal teatas AMD, et loobub CTM platformi arendamisest ja hakkab toetama vabavaralisi DirectX11 ning OpenCL platforme. AMD madalatasemeline lähenemisviis oli üks põhjuseid, miks paljud arendajad olid hakanud eelistama nVidia CUDA raamistikku. [2] Streamist sai sujuvalt AMD APP (Accelerated Parallel Processing) tarkvaraarenduskomplekt [3], kuid ka selle ametlik toetamine lõpetati mõned aastad hiljem, kui tuldi välja ROCm'iga.

ROCm toodi välja 2016. aastal [4] koos Boltzmanni initsiatiiviga [5]. ROCm stack põhineb varasemaltel AMD GPU stackidel, millest mõned pärinevad GPUOpenist, teised aga Heterogeneous System Architecture'ist (HSA).

OpenCL muuda

OpenCL on raamistik, et jooksutada programme keskprotsessoritest, graafikaprotsessoritest, digitaalsetest signaaliprotsessoritest, FPGAdest ning teistest protsessoritest või tarkvarakiirenditest. OpenCL sätestab programmeerimiskeele (C99, C++14 või C++17), mida seadmete programmeerimiseks kasutada ning rakendusliidesed, et jooksutada eelpoolmainitud seadmetel programme. OpenCL sisaldab standartset liidest paraleelarvutuste teostamiseks nii ülesande- kui ka andmepõhiselt.

OpenCLi töötas algselt välja Apple, see toodi turule 2009. aastal koos Mac OS X Snow Leopardiga. Praegu arendab seda mittetulunduslik tehnoloogiakonsortium Khronos Group, mille asutajateks olid näiteks ATI (praegu AMD) ja Intel. Hiljuti on Khronos ratifitseerinud ka SYCLi, kõrgema taseme programmeerimismudeli OpenCLi jaoks, mis baseerub C++17-l, et tõsta koodi kirjutamise produktiivsust. Raamistiku viimane suurem uuendus, OpenCL 3.0 toodi välja 2020. aasta sügisel.[6]

OpenCL kasutab neljatasemelist mälu hierarhiat:

  • globaalne mälu: jagatud kõikide protsessorite vahel, kuid suure laktensusega
  • püsimälu: kirjutatav vaid host keskprotsessori poolt, kuid väikese laktentsusega
  • lokaalne mälu: jagatud protsessorite rühma vahel
  • privaatmälu: ühe protsessori poolt ligipääsetav mälu

Üks OpenCLi tähtsamaid karakteristikuid on porditavus, mis saavutatakse läbi abstraktse mäluhalduse ja käivitusreegilistku (execution model). Samas ei pruugi jõudlus peale portimist olla enam rahludav, alternatiividega võrreldava jõudluse saavutamiseks on siiski vaja koodi riistvara-spetsiifiliselt optimiseerida. 2011. aasta Delfti ülikooli uurimistöö käigus leiti, et CUDA programmide otsene implementatsioon OpenCLis on keskeltläbi 30% aeglasem, kuid peale optimiseerimist üpriski võrdväärne. [7]

OpenCL suudab ülesandeid jaga kesk- ja graafikaprotsessori vahel, mis tähendab, et arendajad saavad optimiseerida tööjaotust vastavalt kummagi protsessori tugevustele. On uuritud masinõppe kasutamist jaotuse teostamiseks, et vältida optimiseerimist programmide jooksutamise kaudu [8].

HSA muuda

HSA ehk Heterogeneous System Architecture (heterogeenne süsteemi arhitektuur) on tootjateülene spetsifikatsioonikogum, mis võimaldab integreerida keskprotsessori ja graafikaprotsessori samale siinile, jagades mälu ning ülesandeid. Platformi eesmärk on vähendada suhtluse latentsust keskprotsessori ja teiste arvutusseadmete (eelkõige graafikaprotsessorite) vahel.

CUDA ja OpenCL toetavad HSA kasutamist, suurendamaks süsteemi võimekust. Algselt tuli HSA kasutusele manussüsteemides (PowerPC Cell, kasutati näiteks Playstation 3-es). Heterogeenne arvutamine on laialt kasutuses ühe kiibi süsteemides (nutiseadmed, mängukonsoolid). HSA lubab rakendustel kasutada graafikaprotsessorit ilma eraldi mäluta või ilma ressursijaotuseta. [9]

HSA võimaldab igal süsteemi arvutusseadmel töötada protsessoriga samal tasandil, HSA defineerib kõikide süsteemi arvutusseadmete jaoks ühtse virtuaalse aadressiruumi. HSA käsib seadmetel jagada oma virutaalmälu lehekülgesid, et seadmed saaksid viitasid jagades andmeid vahetada. HSA on loodud olema käsustiku suhtes ükskõikne ning toetama ka kõrgtasema programmeerimiskeeli. [10]

 
Juurdepääs mälule ilma vs kasutades HSAd

GPUOpen muuda

GPUOpen on AMD poolt arendatav tarkvarapakett, mis on eelkõige suunatud arvutimängude visuaalefektide väljatöötamiseks, kuid see leiab kasutust ka teadusarvutustes. nVidia vastav tarkvarapakett kannab nimetust nVidia GameWorks. Erinevalt GameWorksist on GPUOpen aga osaliselt vabavaraline, AMD tahab sellega soosida tarkvara porditavust. [11]

GPUOpeni peamised komponendid on:

  • TressFX
  • GeometryFX
  • DepthOfFieldFX
  • ShadowFX
  • FidelityFX

FidelityFX Super Resolution muuda

FidelityFX Super Resolution (FSR) on tarkvaralahendus, mis võimaldab sisendpilti skaleerida kõrgema lahutusvõimega pildiks. FSRi algse versiooniga tuldi välja 2021. aastal. FSR on täielikult vabavaraline.

FSR 1 on kaadriinformatsioonil põhinev skaleerija, mis kasutab Lanczose algoritmi. Kaadris kuvatavate objektide piirjoonte tuvastamiseks arvutatakse gradiendid ja võrreldakse neid naabergradientidega. Selle põhjal rekonstrueeritud pikslitele rakendatavad kaalud. FSR 1 rakendatakse kaadrile, millel on juba kasutatud sakitõrjet (inglise k anti-aliasing) ja toonikaardistamist (inglise k tone-mapping) ehk laia dünaamilise ulatusega kaader on kompresseeritud kuvari peal kuvatava ulatusega kaadriks, samal ajal säilitades maksimaalselt detailsust.[12]

FSR 2 kasutab skaleerimisel samuti Lanczose algoritmi, kuid kasutab lisaks skaleeritavale kaadrile ka nihkevektoreid ja informatsiooni eelnevatest kaadritest. FSR 2 on nõudlikum kui FSR 1, samuti vajab see eraldi rakendusepoolset tuge. FSR 2 rakendatakse ajalise sakitõrje asemel (inglise k temporal anti-aliasing). Kõiki efekte, mis vajavad sügavuspuhvri andmeid tuleks rakendada enne FSR 2. [13]

FSR 3 võimaldab parandada pilti (rakendada sakitõrjet) ka lahutusvõimet suurendamata, lisaks on see versioon võimeline genereerima arvutuslikult uusi kaadreid (inglise k frame generation). Vältimaks liigset artifaktide teket, soovitab AMD kasutada kaadrite genereerimist vaid suurematel kaadrisagedustel kui 60. Siiski põhjustab kaadrite genereerimine paratamatult latentsust. Selle leevendamiseks on AMD loonud draiveri-tasemel tarkvara, Anti-Lag, kuid see töötab vaid AMD graafikaprotsessoritega.[14]

Riistvaraline ühilduvus muuda

ROCm on peamiselt suunatud diskreetsetele tööjaama graafikaprotsessoritele, kuid mitte-ametlikult on toetatud ka Vega ja RDNA perekondade tavakasutajatele suunatud graafikaprotsessorid [15]. ROCm töötab keskprotsessoritega, mis toetavad PCIe atomics käske ehk näiteks AMD protsessorid alates esimese generatsiooni Zen perekonnast ja Inteli protsessorid Haswelli perekonnast.

Võimalused ja ühilduvus kolmandate osapoolte tarkvaradega muuda

ROCm'i kasutusala ulatub kerneli-tasemel draiveritest kuni lõpp-kasutajale loodud rakendusteni. AMD on loonud tutvustavaid videosid ROCm tööristadega programmeerimisega alustamiseks.

ROCm on sobilik teadusarvutuste rakendusteks, mis nõuavad suurt arvutusvõimsust ja mälumahtu. Seda kasutatakse laialdaselt sellistes valdkondades nagu molekulaardünaamika, kliimamodelleerimine ja astronoomia. Samuti saab ROCm-i kasutada ka visuaaltöötlusrakenduste jaoks, näiteks 3D-renderdamise ja graafiline disain. ROCm on ka hea valik andmeteaduse rakendusteks, mis hõlmavad masinõppe ja keeletöötluse ülesandeid.

Mitmed masinõppe raamistikud toetavad ROCm'i back-end-is, näiteks:

  • PyTorch
  • TensorFlow
  • ONNX
  • MXNet
  • CuPY
  • MIOpen
  • Caffe
  • Iree
  • LLaMA

GPU riistvarakiirendust kasutavad ROCm tarkvara toetavad rakendused on leitavad AMD kodulehelt [16]. Näiteks 3D-graafika tarkvara Blender toetab HIP arvutuskerneleid renderdamiseks [17]. Samuti on ROCm-OpenCL kasutatav DaVinci Resolve videotöötlustarkvaraga.

Ülesehitus muuda

ROCm koosneb paljudest riistvaraga erineval tasemel suhtlevates komponentidest. Lihtsustavalt võib need jaotada järgneval viisil kolmeks osaks.

Riistvaralähedased komponendid muuda

  • ROCk - kerneli draiver
  • ROCm - seadme teegid
  • ROCt
  • ROCr
  • ROCm kompilaatori tugi

Keskmise taseme komponendid muuda

  • ROCclr (Common Runtime Language)
  • OpenCL
  • HIP (Heterogeneous Interface for Portability)
  • HIPCC
  • HIPIFY
  • GPUFORT

Kõrgema taseme komponendid muuda

  • rocBLAS & hipBLAS - AMD implementatsioon BLASi jaoks (Basic Algebra Subprograms)
  • rocSOLVER & hipSOLVER - LAPACKi (Linear Algebra Package) implementatsioon ROCm'i jaoks

Võrdlus alternatiividega muuda

ROCm'i peamisteks alternatiivideks on nVidia arendatav CUDA ja Inteli algatatud OneAPI (UXL).

NVidia Cuda muuda

Erinevalt ROCm-ist ei ole CUDA avatud lähtekoodiga, kuigi CUDA baasil on kirjutatatud avatud lähtekoodiga tarkvara. Samas on CUDAl aga parem tugi tavakasutajatele suunatud GPUde hulgas, ROCm tugi on suunatud eelkõige AMD Radeon Pro seeria graafikakaartidele ja AMD Instinct seeria masinõppeks loodud moodulitele. Praegu loetakse sektoris CUDAt vaikimisi standardiks, kuid arendajad on väljendanud pahameelt nVidia tarkvara suletuse ja riistvarapiirangute üle.

ROCm puudujääkideks võrreldes CUDAga peetakse komponentide killustatust ja dokumentatsiooni puudulikust. Samuti on testimisel leitud, et ROCm on ca 40% aeglasem kui CUDA (tulemused võivad olla kallutatud, sest testimisel kasutati nVidia graafikaprotsessorit)[18]. Teine suur puudujääk võrreldes CUDAga on ühtse käsustiku puudumine. NVidia CUDA pakett töötab pea kõigil nVidia graafikaprotsessoritel, sest PTX (Parallel Thread Execution) suudab tõlkida koodi ühtsest käsustikust masinkoodi. AMD ROCmi puhul tuleb aga teise graafikaprotsessori tarvis masinkood uuesti kompileerida.

Intel OneAPI (UXL) muuda

Sarnaselt ROCmile on ka OneAPI avatud lähtekoodiga ning kättesaadav GitHubi keskkonnas. UXL on tehnoloogiakonsortium, mille eesmärgiks on edasi arendada OneAPI-l põhinevat tarkvara võistlemaks nVidia CUDA-ga. Konsortiumi taga on mitmed tehnoloogiahiiud: Intel, Google, ARM, Qualcomm, Samsung, Imagination, VMware [19].

ZLUDA muuda

Vabavaraline ZLUDA portimistarkvara võimaldab kasutada CUDA tarkvarapaketi jaoks kirjutatud programme graafikaprotsessoril läbi AMD ROCm paketi. Kohati on võimalik saavutada otse CUDA peal jookustatavate masinatega sarnast jõudlust. [20]

Viited muuda

  1. AMD, "AMD ROCm Software", 2024, https://github.com/ROCm/ROCm?tab=readme-ov-file
  2. T. Valich, 2008, "AMD Ditches Close-To-Metal, Focuses On DX11 And OpenCL", https://www.tomshardware.com/news/AMD-stream-processor-GPGPU,6072.html
  3. AMD, "APP SDK", 2013, https://web.archive.org/web/20140701140057/http://developer.amd.com/tools-and-sdks/opencl-zone/opencl-tools-sdks/amd-accelerated-parallel-processing-app-sdk/
  4. R. Smith, "AMD @ SC16: Radeon Open Compute Platform (ROCm) 1.3 Released, Boltzmann Comes to Fruition", 2016, https://www.anandtech.com/show/10831/amd-sc16-rocm-13-released-boltzmann-realized/
  5. R. Smith, "AMD @ SC15: Boltzmann Initiative Announced - C++ and CUDA Compilers for AMD GPUs", 2015, https://www.reuters.com/technology/behind-plohttps://www.anandtech.com/show/9792/amd-sc15-boltzmann-initiative-announced-c-and-cuda-compilers-for-amd-gpus
  6. Khronos, "OpenCL", https://www.khronos.org/opencl/
  7. J. Fang, A. L. Varbanescu, H. Sips, "A Comprehensive Performance Comparison of CUDA and OpenCL", IEEE International Parallel and Distributed Processing Symposium, 28, 2014
  8. D. Grewe, M. F. P. O'Boylr, "A Static Task Partitioning Approach for Heterogeneous Systems Using OpenCL", Lecture Notes in Computer Science, 6601, 2011
  9. J. Hruska, "Setting HSAIL: AMD explains the future of CPU/GPU cooperation", 2013, https://www.extremetech.com/gaming/164817-setting-hsail-amd-cpu-gpu-cooperation
  10. G. Kyriazis, "Heterogeneous System Architecture: A Technical Review", AMD, 2012, https://web.archive.org/web/20140328140823/http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/hsa10.pdf
  11. C. Angelini, "AMD GPUOpen: Doubling Down On Open-Source Development", 2015, https://www.tomshardware.com/news/amd-gpuopen-open-source-development,30750.html
  12. AMD, "FidelityFX Super Resolution 1", https://gpuopen.com/fidelityfx-superresolution/
  13. AMD, "FidelityFX Super Resolution 2", https://gpuopen.com/fidelityfx-superresolution-2/
  14. R. Leadbetter, "AMD reveals long-awaited FSR 3 tech and frame gen for every DX11/DX12 game", 2023, https://www.eurogamer.net/digitalfoundry-2023-amd-reveals-long-awaited-fsr-3-tech-and-frame-gen-for-every-dx11dx12-game
  15. AMD, "Compability Matrices", https://rocm.docs.amd.com/projects/radeon/en/latest/docs/compatibility.html
  16. AMD, https://www.amd.com/system/files/documents/gpu-accelerated-applications-catalog.pdf
  17. Blender, https://www.blender.org/download/releases/3-0/
  18. 1kg, "CUDA vs ROCm: The Ongoing Battle for GPU Computing Supremacy", 2024, https://medium.com/@1kg/cuda-vs-rocm-the-ongoing-battle-for-gpu-computing-supremacy-82eb916fbe18
  19. M. A. Cherney, "Behind the plot to break Nvidia's grip on AI by targeting software", 2024, https://www.reuters.com/technology/behind-plot-break-nvidias-grip-ai-by-targeting-software-2024-03-25/
  20. M. Zuhair, "AMD GPUs Now Indirectly Support NVIDIA CUDA Libraries With ROCm Using ZLUDA", 2024, https://wccftech.com/amd-gpus-now-indirectly-support-nvidia-cuda-libraries-with-rocm-using-zluda/