Sovellusten kääntäminen Roihussa
Info
Roihussa on erilliset CPU- ja GPU-osiot, joissa on eri CPU-arkkitehtuurit:
- Roihu-CPU-solmut käyttävät AMD:n (x86) prosessoreita
- Roihu-GPU-solmut käyttävät NVIDIA Gracen (ARM) prosessoreita
Yhdelle arkkitehtuurille käännetyt binäärit eivät toimi toisessa. Siksi ohjelmistot tulee kääntää samalla puolella, jolla niitä ajetaan:
- Käännä CPU-solmuille Roihu-CPU:n kirjautumissolmulla
- Käännä GPU-solmuille Roihu-GPU:n kirjautumissolmulla
Yleiset ohjeet
-
Käytä aina kun mahdollista kirjautumissolmun paikallista levyä ohjelmistojen kääntämiseen.
- Kääntäminen paikallisella levyllä on paljon nopeampaa ja vähentää kuormaa jaetusta tiedostojärjestelmästä.
- Paikallinen levy siivotaan usein, joten siirrä tiedostosi muualle kääntämisen jälkeen.
-
Katso sivu saatavilla olevista HPC-kirjastoista, kun haluat käyttää yleisiä kirjastoja (BLAS, FFTW, ...) ja linkittää ne sovelluksiisi.
Kääntäminen Roihu-CPU:ssa
Info
Kun käännät Roihussa CPU-solmuille, varmista että käytät Roihun CPU-kirjautumissolmuja. Roihu-GPU:ssa käännetyt binäärit eivät ole yhteensopivia Roihu-CPU-solmujen kanssa.
Roihu-CPU tarjoaa GNU- ja AMD AOCC -käännösympäristöt C/C++- ja Fortran-sovellusten rakentamiseen seuraavilla moduuleilla:
| Kääntäjäkokonaisuus | Moduulit |
|---|---|
| GNU 15.2.0 | gcc/15.2.0 openmpi/5.0.10 |
| AMD AOCC 5.0.0 | aocc/5.0.0 openmpi/5.0.10 |
Ensimmäinen kääntäjäkokonaisuus on ladattu oletuksena. Voit vaihtaa ympäristöä lataamalla luetellut moduulit, esimerkiksi
Listaa kaikki saatavilla olevat kääntäjäkokonaisuuksien versiot:
Kääntäjien suoritustiedostot ovat seuraavat:
| Kääntäjäkokonaisuus | C | C++ | Fortran |
|---|---|---|---|
| GNU | gcc | g++ | gfortran |
| AMD | clang | clang++ | flang |
Sovelluksille, jotka riippuvat MPI:stä, suositellaan käytettäväksi sen sijaan kääntäjän wrapper-ohjelmia, jotka on kuvattu alla olevassa MPI-osiossa.
Eri kääntäjäkokonaisuuksien kääntäjävalitsimet ovat erilaisia. Alla olevassa taulukossa on lueteltu suositellut perusoptimointiliput. On suositeltavaa aloittaa turvalliselta tasolta ja siirtyä sitten keskitasolle tai jopa aggressiiviselle tasolle varmistaen samalla, että tulokset ovat oikein ja ohjelman suorituskyky on parantunut.
| Optimointitaso | GNU | AMD (clang) |
|---|---|---|
| Turvallinen | -O2 -march=znver5 | -O2 -march=znver5 |
| Keskitaso | -O3 -march=znver5 | -O3 -march=znver5 |
| Aggressiivinen | -O3 -march=znver5 -ffast-math -funroll-loops |
Esimerkki muun kuin MPI:tä käyttävän C-ohjelman kääntämisestä GNU-ympäristössä:
Yksityiskohtainen luettelo GNU- ja AMD-kääntäjien valitsimista löytyy man-
sivuilta (man gcc/gfortran), kun vastaava ohjelmointiympäristö on ladattu,
tai kääntäjien käyttöoppaista:
- GNU
- AMD AOCC
Suosittelemme testaamaan ja profiloimaan sovelluksesi molemmilla kääntäjäkokonaisuuksilla, jotta näet, mikä kääntäjä toimii parhaiten omassa käyttötapauksessasi.
MPI-sovellusten rakentaminen
Roihun MPI-ympäristö on OpenMPI. Voit käyttää jotakin MPI-kääntäjän wrapper-ohjelmista
mpicc (C), mpicxx (C++) tai mpif90 (Fortran), kun käännät MPI-sovelluksia.
Nämä wrapperit kutsuvat lopulta parhaillaan ladatun kääntäjäkokonaisuuden kääntäjää
(GNU tai AMD) ja toimivat molemmissa kääntäjäkokonaisuuksissa.
Esimerkki:
Listaa kaikki saatavilla olevat OpenMPI-versiot (yksi on aina ladattu oletuksena):
OpenMP- ja hybridisovellusten rakentaminen
OpenMP- tai hybridi-MPI+OpenMP-sovelluksen rakentamiseen tarvitaan ylimääräinen kääntäjän ja linkkerin lippu:
| Kääntäjäkokonaisuus | OpenMP-lippu |
|---|---|
| GNU ja AMD | -fopenmp |
Esimerkki hybridi-MPI+OpenMP-sovelluksen kääntämisestä:
Kääntäminen Roihu-GPU:ssa
Info
Kun käännät Roihussa GPU-solmuille, varmista että käytät Roihun GPU-kirjautumissolmuja. Roihu-CPU:ssa käännetyt binäärit eivät ole yhteensopivia Roihu-GPU-solmujen kanssa.
Roihu-GPU tarjoaa GNU- ja NVIDIA-HPC -käännösympäristöt C/C++- ja Fortran-sovellusten rakentamiseen seuraavilla moduuleilla:
| Kääntäjäkokonaisuus | Moduulit |
|---|---|
| GNU 14.3.0 + CUDA 12.9.1 | gcc/14.3.0 cuda/12.9.1 openmpi/5.0.8 openblas/0.3.30 |
| GNU 15.2.0 + CUDA 13.1.1 | gcc/15.2.0 cuda/13.1.1 openmpi/5.0.8 openblas/0.3.30 |
| NVIDIA HPC 26.3 | nvhpc/26.3 |
Ensimmäinen kääntäjäkokonaisuus on ladattu oletuksena. Voit vaihtaa ympäristöä lataamalla luetellut moduulit, esimerkiksi
Tietoa nvhpc-moduulista
Huomaa, että nvhpc-moduuli sisältää CUDA-, MPI- ja BLAS-toteutukset,
joten näitä moduuleja ei tarvitse ladata erikseen, kun käytät nvhpc-moduulia.
Tästä syystä module load saattaa ilmoittaa sinulle inaktiivisista moduuleista.
Jotta inaktiivisia moduuleja ei jäisi, voit tyhjentää moduulit ennen ympäristön lataamista:
Listaa kaikki saatavilla olevat kääntäjäkokonaisuuksien versiot:
Kääntäjien suoritustiedostot ovat seuraavat:
| Kääntäjäkokonaisuus | C | C++ | Fortran |
|---|---|---|---|
| GNU | gcc | g++ | gfortran |
| NVIDIA HPC | nvc | nvc++ | nvfortran |
Lisäksi CUDA-kääntäjä nvcc on saatavilla GPU-ydinkoodin rakentamiseen. Katso alla oleva CUDA-osio.
CUDA-sovellusten kääntäminen
CUDA on suositeltu ohjelmointimalli Nvidia-GPU:ille, ja se on
saatavilla cuda- ja nvhpc-moduuleissa.
CUDA-kääntäjä (nvcc) huolehtii CUDA-ydinkoodin kääntämisestä kohde-GPU-laitteelle
ja välittää loput parhaillaan ladatulle isäntäkääntäjälle, kuten gcc:lle tai nvhpc:lle.
Jotta koodia voidaan tuottaa tietylle kohdelaitteelle, CUDA-kääntäjälle
on kerrottava, mitä compute capability -tasoa kohdelaitteisto tukee. Roihussa
GPU:t (Hopper 200) tukevat compute capability 9.0:aa. Määritä tämä käyttämällä
valitsinta -gencode arch=compute_90,code=sm_90. Vaihtoehtoisesti voit käyttää compute_90a
tai sm_90a, jotta Hopper-kohtaiset laajennusominaisuudet otetaan käyttöön, mikä voi tuottaa
suorituskykyisempää koodia.
Esimerkiksi CUDA-ytimen (example.cu) kääntäminen Roihussa:
Info
Koodi, joka on tuotettu asetuksilla arch=compute_90a tai code=sm_90a, ei ole taaksepäin
eikä eteenpäin yhteensopivaa muiden GPU-arkkitehtuurien kanssa. Jos tämä on sinulle tärkeää,
käytä yleisempiä valitsimia arch=compute_90,code=sm_90.
MPI+CUDA-sovellusten kääntäminen
Kaikki tarjotut GNU- ja NVIDIA-kääntäjäympäristöt sisältävät CUDA-tietoisen MPI-kirjaston.
Jos MPI+CUDA-sovelluksen rakenne sen sallii, voit rakentaa sen osissa:
- Käännä CUDA-ytimet objektitiedostoiksi komennolla
nvcc -c - Käännä isäntäkoodi objektitiedostoiksi MPI-kääntäjän wrapper-ohjelmilla, jotka kutsuvat ladattua isäntäkääntäjää (
mpicc -c,mpicxx -ctaimpif90 -c) - Linkitä kaikki objektitiedostot MPI-kääntäjän wrapper-ohjelmalla (
mpicc,mpicxxtaimpif90)
On myös mahdollista kääntää koko koodipohja nvcc:llä, mutta silloin
tarvittavat MPI:n käännös- ja linkitysvalitsimet on annettava
nvcc:n kutsumalle taustalla olevalle isäntäkääntäjälle.
Tämä voidaan tehdä seuraavasti -Xcompiler- ja -Xlinker-lipuilla:
# Parse MPI options for compiler
Xcompiler="-Xcompiler $(mpicxx --showme | tr ' ' '\n' | sed '/^-Wl,/d;1d' | paste -sd, -)"
# Parse MPI options for linker
Xlinker="-Xlinker $(mpicxx --showme | tr ' ' '\n' | sed -n 's/^-Wl,//p' | paste -sd, -)"
# Compile MPI code using nvcc
nvcc -gencode arch=compute_90a,code=sm_90a $Xcompiler $Xlinker mpi_cuda_code.cu
Warning
Muista ladata kääntämisessä käytetyt moduulit myös sovellusta ajettaessa, jotta oikeaa MPI-kirjastoa käytetään ajon aikana.
OpenMP offloadia, OpenACC:tä ja C++-standardin rinnakkaisuutta käyttävän sovelluksen kääntäminen
Warning
NVIDIA HPC -kääntäjien käyttöä suositellaan OpenMP offloadia, OpenACC:tä ja C++-standardin rinnakkaisuutta käyttävien ohjelmien kääntämiseen.
Aloita lataamalla NVIDIA HPC -kääntäjät:
Eri GPU-ohjelmointimallien käyttöönottoon tarvittavat kääntäjävalitsimet ovat seuraavat:
| Ohjelmointimalli | Kääntäjävalitsin |
|---|---|
| OpenMP offload | -mp=gpu |
| OpenACC | -acc=gpu |
| C++ stdpar | -stdpar=gpu (nvc++ only) |
Jotta Roihun GH200-superpiireille tuotetaan tehokasta koodia, määritä kohde seuraavalla valitsimella:
Esimerkkikäännöskomennot:
| Ohjelmointimalli | C | C++ | Fortran |
|---|---|---|---|
| OpenMP offload | nvc -O3 -mp=gpu -gpu=cc90 example.c |
nvc++ -O3 -mp=gpu -gpu=cc90 example.cpp |
nvfortran -O3 -mp=gpu -gpu=cc90 example.F90 |
| OpenACC | nvc -O3 -acc=gpu -gpu=cc90 example.c |
nvc++ -O3 -acc=gpu -gpu=cc90 example.cpp |
nvfortran -O3 -acc=gpu -gpu=cc90 example.F90 |
| C++ stdpar | N/A | nvc++ -O3 -stdpar=gpu -gpu=cc90 example.cpp |
N/A |
Kääntäjät tukevat myös koodeja, joissa on useita ohjelmointimalleja. Esimerkiksi C++-koodi, joka sisältää OpenMP offloadia, OpenACC:tä ja C++-rinnakkaisalgoritmeja, käännetään komennolla:
OpenMP offloadia, OpenACC:tä ja C++-standardin rinnakkaisuutta käyttävän MPI-sovelluksen kääntäminen
nvhpc-moduuli sisältää GPU-tietoisen MPI-toteutuksen tavallisine
kääntäjän wrapper-ohjelmineen, ja MPI-sovellukset voidaan kääntää
kuten yllä, mutta korvaamalla nvc, nvc++ ja nvfortran
vastaavasti komennoilla mpicc, mpicxx ja mpif90:
| Ohjelmointimalli | C | C++ | Fortran |
|---|---|---|---|
| OpenMP offload | mpicc -O3 -mp=gpu -gpu=cc90 example.c |
mpicxx -O3 -mp=gpu -gpu=cc90 example.cpp |
mpif90 -O3 -mp=gpu -gpu=cc90 example.F90 |
| OpenACC | mpicc -O3 -acc=gpu -gpu=cc90 example.c |
mpicxx -O3 -acc=gpu -gpu=cc90 example.cpp |
mpif90 -O3 -acc=gpu -gpu=cc90 example.F90 |
| C++ stdpar | N/A | mpicxx -O3 -stdpar=gpu -gpu=cc90 example.cpp |
N/A |