Compiler AMD ALELEON Supercomputer: Perbedaan antara revisi

Dari ALELEON by EFISON
(initial writing, hingga Intel MKL)
 
(→‎Threading pada AMD Zen2: melengkapi threading Zen2)
Baris 46: Baris 46:
Ketike menggunakan Intel MKL untuk build framework, user harus menggunakan integer size 4 (32 bit). Sistem AMD di HPC Aleleon Mk.II tidak mendukung integer size 8 (64 bit).
Ketike menggunakan Intel MKL untuk build framework, user harus menggunakan integer size 4 (32 bit). Sistem AMD di HPC Aleleon Mk.II tidak mendukung integer size 8 (64 bit).


== '''Threading pada AMD Zen2''' ==
== '''Threading di AMD Zen2 dan Contoh SLURM Script''' ==
AMD EPYC Rome menggunakan arsiterktur Zen2. AMD Zen2 baik untuk HEDT/server memiliki hingga 8 grup CCD dimana masing-masing CCD berisikan 2 CCX. Setiap CCX memiliki 4 core dengan masing-masing core memiliki 2 thread yang dihasilkan oleh SMT (''simultaneous multi-threading''). Pada satu CCX, terdapat shared L3 cache berukuran 16 MB yang dapat diakses oleh seluruh 8 thread pada CCX tersebut. Penggunaan process dengan jumlah threading yang tepat akan mencegah penggunaan L3 cache di luar CCX sehingga akan mengurangi latensi proses dan menghasilkan performa yang lebih baik.
 
EFISON menyarankan jumlah '''threading 4 atau 8 threads per MPI processes''' untuk performa maksimal di program hybrid MPI, mengikuti jumlah '''thread per CCX.'''
[[Berkas:Zen2-uarch-1536x1256.jpg|nir|jmpl|800x800px|Arsitektur AMD Zen2]]
 
=== Threading di BLIS ===
Deklarasi jumlah thread BLIS dengan export BLIS_NUM_THREADS tidak berlaku lagi untuk AMD BLIS versi 2 keatas. Sebagai gantinya user harus melakukan deklarasi manual semua variabel di bawah ini:
{| class="wikitable"
|+Variabel threading BLIS
!Variabel
!Penjelasan
|-
|BLIS_JC_NT
|Paralelisasi di outer loop (5th max)
|-
|BLIS_IC_NT
|Paralelisasi di 3rd loop
|-
|BLIS_JR_NT
|Paralelisasi di 2nd loop
|-
|BLIS_IR_NT
|Paralelisasi di 1st loop
|}
Dengan aturan total thread adalah total perkalian dari semua variabel diatas:
Total thread = BLIS_JC_NT * BLIS_IC_NT * BLIS_JR_NT * BLIS_IR_NT
Untuk arsitektur AMD Zen2, '''karena setiap CCX terdapat shared L3 cache maka paralelisasi akan dilakukan di level BLIS_IC_NT'''. Contoh deklarasi threading BLIS pada SLURM:
#SBATCH --cpus-per-task=<jumlah thread yang diinginkan>
export BLIS_JC_NT=1
export BLIS_IC_NT=${SLURM_CPUS_PER_TASK}
export BLIS_JR_NT=1
export BLIS_IR_NT=1
 
=== Threading di OpenBLAS ===
Threading pada OpenBLAS dideklarasikan melalui variabel OPENBLAS_NUM_THREADS, GOTO_NUM_THREADS, dan OMP_NUM_THREADS. Contoh deklarasi threading OpenBLAS pada SLURM:
#SBATCH --cpus-per-task=<jumlah thread yang diinginkan>
threads=${SLURM_CPUS_PER_TASK}
export OPENBLAS_NUM_THREADS=$threads
export GOTO_NUM_THREADS=$threads
export OMP_NUM_THREADS=${threads}
 
=== Threading di Intel MKL ===
Threading pada Intel MKL dideklarasikan melalui variabel OMP_NUM_THREADS dan MKL_NUM_THREADS. Contoh deklarasi threading Intel MKL pada SLURM:
#SBATCH –cpus-per-task=<jumlah thread yang diinginkan>
threads=${SLURM_CPUS_PER_TASK}
export OMP_NUM_THREADS=${threads}
export MKL_NUM_THREADS=${threads

Revisi per 30 Maret 2021 07.31

HPC Aleleon Mk.II mempunyai set library dan compiler yang dioptimasi untuk AMD EPYC. Halaman ini merangkum info teknis penting tentang penggunaan compiler dan software AMD tersebut supaya user dapat sepenuhnya memanfaatkan performa AMD EPYC Rome.

GCC 9 dan 10

HPC Aleleon Mk.II menggunakan GCC 9.3.1 RHEL sebagai GCC sistem. Selain itu tersedia GCC 10.2.0 yang dapat diakses dengan modul:

$ module load GCC/10.2.0

Keduanya mendukung flag optimasi march untuk AMD EPYC Rome dengan:

-march=znver2

AMD Optimizing CPU Libraries (AOCL)

AOCL adalah set library numerik dan matematika untuk komputasi HPC yang dibuat khusus untuk keluarga AMD EPYC. Saat ini HPC Aleleon Mk.II menggunakan AOCL versi 3.0. AOCL yang tersedia di HPC Aleleon Mk.II adalah:

Library Penjelasan
BLIS

(BLAS-like Library Instantiation Software)

Framework portable BLAS (Basic Linear Algebra Subprograms) yang dbuat oleh Flame kemudian dikembangkan spesifik oleh AMD untuk AOCL. Menggunakan BLIS:
$ module load blis

BLIS yang digunakan di HPC Aleleon Mk.II adalah versi multi-threading. Flag untuk melakukan compile dengan BLIS:

-lblis-mt
LibFLAME Portable library untuk komputasi matrix atau LAPACK (Linear Algebra Package). Menggunakan LibFLAME:
$ module load libflame

Flag untuk melakukan compile dengan LibFLAME:

-lflame
AMD LibM

(Core Math Library)

Menyediakan fungsi-fungsi matematika untuk prosesor x86-64 (seperti -lm di GCC). Compatible dengan compiler GCC dan Intel. Menggunakan LibM:
$ module load LibM

Untuk menggunakan AMD LibM, flag compiling wajib dilakukan dengan urutan berikut (tidak boleh terbalik):

-lamdlibm -lm
AMD FFTW FFTW (Fastest Fourier Transform in the West) yang khusus dioptimalisasi untuk AMD. Menggunakan AMD FFTW:
$ module load fftw

Bacaan lebih lanjut untuk info yang lebih detail:

Intel MKL di AMD

User dapat menggunakan Intel MKL (Math Kernel Library) di sistem AMD melalui Intel oneAPI dengan modul:

$ module load oneapi

Ketike menggunakan Intel MKL untuk build framework, user harus menggunakan integer size 4 (32 bit). Sistem AMD di HPC Aleleon Mk.II tidak mendukung integer size 8 (64 bit).

Threading di AMD Zen2 dan Contoh SLURM Script

AMD EPYC Rome menggunakan arsiterktur Zen2. AMD Zen2 baik untuk HEDT/server memiliki hingga 8 grup CCD dimana masing-masing CCD berisikan 2 CCX. Setiap CCX memiliki 4 core dengan masing-masing core memiliki 2 thread yang dihasilkan oleh SMT (simultaneous multi-threading). Pada satu CCX, terdapat shared L3 cache berukuran 16 MB yang dapat diakses oleh seluruh 8 thread pada CCX tersebut. Penggunaan process dengan jumlah threading yang tepat akan mencegah penggunaan L3 cache di luar CCX sehingga akan mengurangi latensi proses dan menghasilkan performa yang lebih baik.

EFISON menyarankan jumlah threading 4 atau 8 threads per MPI processes untuk performa maksimal di program hybrid MPI, mengikuti jumlah thread per CCX.

Arsitektur AMD Zen2

Threading di BLIS

Deklarasi jumlah thread BLIS dengan export BLIS_NUM_THREADS tidak berlaku lagi untuk AMD BLIS versi 2 keatas. Sebagai gantinya user harus melakukan deklarasi manual semua variabel di bawah ini:

Variabel threading BLIS
Variabel Penjelasan
BLIS_JC_NT Paralelisasi di outer loop (5th max)
BLIS_IC_NT Paralelisasi di 3rd loop
BLIS_JR_NT Paralelisasi di 2nd loop
BLIS_IR_NT Paralelisasi di 1st loop

Dengan aturan total thread adalah total perkalian dari semua variabel diatas:

Total thread = BLIS_JC_NT * BLIS_IC_NT * BLIS_JR_NT * BLIS_IR_NT

Untuk arsitektur AMD Zen2, karena setiap CCX terdapat shared L3 cache maka paralelisasi akan dilakukan di level BLIS_IC_NT. Contoh deklarasi threading BLIS pada SLURM:

#SBATCH --cpus-per-task=<jumlah thread yang diinginkan>

export BLIS_JC_NT=1
export BLIS_IC_NT=${SLURM_CPUS_PER_TASK}
export BLIS_JR_NT=1
export BLIS_IR_NT=1

Threading di OpenBLAS

Threading pada OpenBLAS dideklarasikan melalui variabel OPENBLAS_NUM_THREADS, GOTO_NUM_THREADS, dan OMP_NUM_THREADS. Contoh deklarasi threading OpenBLAS pada SLURM:

#SBATCH --cpus-per-task=<jumlah thread yang diinginkan>

threads=${SLURM_CPUS_PER_TASK}
export OPENBLAS_NUM_THREADS=$threads
export GOTO_NUM_THREADS=$threads
export OMP_NUM_THREADS=${threads}

Threading di Intel MKL

Threading pada Intel MKL dideklarasikan melalui variabel OMP_NUM_THREADS dan MKL_NUM_THREADS. Contoh deklarasi threading Intel MKL pada SLURM:

#SBATCH –cpus-per-task=<jumlah thread yang diinginkan>

threads=${SLURM_CPUS_PER_TASK}
export OMP_NUM_THREADS=${threads}
export MKL_NUM_THREADS=${threads