ROCm

**ROCm** (*Radeon Open Compute platform*) on Advanced Micro Devices (AMD) tarkvaralahenduste kogum graafikaprotsessori (GPU) programmeerimiseks. See hõlmab mitmeid valdkondi, sealhulgas üldotstarbelist andmetöötlust graafikaprotsessoritega (GPGPU), suure jõudlusega andmetöötlust (HPC) ja heterogeenset andmetöötlust.

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

ROCm-i kasutatakse nii suure võimsusega andmetöötluses, tehisintellektisüsteemides, teadusarvutustes kui ka raalprojekteerimises (CAD).

## Taust
AMD (varem ATI) esimene tarkvaralahenduste pakett oli Close to Metal (CTM), millest kasvas välja Streami 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 taseme tööriistu utiliseerimaks AMD graafikaprotsessorite riistvara.

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

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

## OpenCL

OpenCL on raamistik, et käitada programme keskprotsessoritest, graafikaprotsessoritest, digitaalsetest signaaliprotsessoritest, FPGA-dest ning teistest protsessoritest või tarkvarakiirenditest. OpenCL sätestab programmeerimiskeele (C99, C++14 või C++17), mida seadmete programmeerimiseks kasutada ning rakendusliidesed, et käitada eelpoolmainitud seadmetel programme. OpenCL sisaldab standardset liidest paralleelarvutuste 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 tehnoloogiakonsortsium Khronos Group, mille asutajateks olid näiteks ATI (praegu AMD) ja Intel. Hiljuti on Khronos ratifitseerinud ka SYCL-i, kõrgema taseme programmeerimismudeli OpenCL-i 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.

OpenCL kasutab neljatasemelist mälu hierarhiat:

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

Üks OpenCL-i tähtsamaid omadusi on porditavus, mis saavutatakse abstraktse mäluhalduse ja käivitusreegilistku (*execution model*) kaudu. Samas ei pruugi jõudlus pärast portimist olla enam rahuldav, alternatiividega võrreldava jõudluse saavutamiseks on siiski vaja koodi riistvara-spetsiifiliselt optimeerida. 2011. aasta Delfti ülikooli uurimistöö käigus leiti, et CUDA programmide otsene implementatsioon OpenCL-is on keskeltläbi 30% aeglasem, kuid pärast optimeerimist üpriski võrdväärne. 

OpenCL saab toiminguid jagaga kesk- ja graafikaprotsessori vahel, mis tähendab, et arendajad saavad optimeerida tööjaotust vastavalt kummagi protsessori tugevustele. On uuritud masinõppe kasutamist jaotuse teostamiseks, et vältida optimeerimist programmide käitamise kaudu .

## HSA

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. Platvormi 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-s). 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. 

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õrgtaseme programmeerimiskeeli. 

## GPUOpen

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

GPUOpeni peamised komponendid on

* TressFX
* GeometryFX
* DepthOfFieldFX
* ShadowFX
* FidelityFX

### FidelityFX Super Resolution

FidelityFX Super Resolution (FSR) on tarkvaralahendus, mis võimaldab sisendpilti skaleerida kõrgema lahutusvõimega pildiks. FSR-i 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 kompressitud kuvaril kuvatava ulatusega kaadriks, samal ajal säilitades maksimaalselt detailsust.

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. 

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 artefaktide 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.

## Riistvaraline ühilduvus

ROCm on peamiselt suunatud diskreetsetele tööjaama graafikaprotsessoritele, kuid mitteametlikult on toetatud kaVega ja RDNA perekondade tavakasutajatele suunatud graafikaprotsessorid . 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

ROCmi kasutusala ulatub kerneli tasemel draiveritest kuni lõpp-kasutajale loodud rakendusteni. AMD on loonud tutvustavaid videoid ROCm tööriistadega 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 . Näiteks 3D-graafika tarkvara Blender toetab HIP arvutuskerneleid renderdamiseks . Samuti on ROCm-OpenCL kasutatav DaVinci Resolve videotöötlustarkvaraga.

## Ülesehitus

ROCm koosneb paljudest riistvaraga eri tasemel suhtlevatest komponentidest. Lihtsustatult võib need liigitada kolmeks.

### Riistvaralähedased komponendid

* ROCk – kerneli draiver
* ROCm – seadme teegid
* ROCt
* ROCr
* ROCm kompilaatori tugi

### Keskmise taseme komponendid

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

### Kõrgema taseme komponendid

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

## Võrdlus alternatiividega

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

### [[CUDA|NVidia Cuda]]

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

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

### Intel OneAPI (UXL)

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

### ZLUDA

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. 

## Viited