Threading di ALELEON Supercomputer
Istilah threading pada ALELEON Supercomputer mengacu pada program yang menggunakan paralelisasi thread per core yaitu paralelisasi OpenMP (OMP), library BLAS, dan hybrid MPI/OMP. Terdapat beberapa aturan untuk menjalankan program tersebut dengan benar dan efisien pada ALELEON Supercomputer.
SLURM SBATCH cpus-per-task
Pada SLURM, user mengalokasikan jumlah thread per core melalui parameter SBATCH cpus-per-task dan variabel SLURM_CPUS_PER_TASK.
Contoh menggunakan OMP:
#SBATCH --ntasks=8 #SBATCH --cpus-per-task=4 export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
Total penggunaan core thread CPU yang dihitung oleh SLURM adalah ntasks * cpus-per-task. Pada contoh di atas, user menggunakan 8*4 = 32 core thread CPU.
Pure OMP
Gunakan alokasi ntasks=1 untuk menjalankan program pure OMP, dengan nilai maksimal cpus-per-task=128. Program Pure-OMP hanya dapat berjalan 1 node.
#SBATCH --nodes=1 #SBATCH --ntasks=1 #SBATCH --cpus-per-task=////
Paralelisasi BLAS
Bagian ini digunakan untuk user yang melakukan compile program dengan komponen library BLAS.
---
Jumlah Thread Optimal
Secara umum, program yang menggunakan threading BLAS atau Hybrid MPI/OMP mampu berjalan secara multi-core sehingga admin EFISON merekomendasikan jumlah threading 2, 4, atau 8 per ntasks atau proses MPI.
---
Threading BLAS pada AMD BLIS
ALELEON Supercomputer menggunakan AMD BLIS (BLAS-like Library Instantiation Software) sebagai library BLAS utama yang telah dioptimasi secara khusus berdasarkan arsitektur AMD Zen2. ALELEON Supercomputer menggunakan AMD BLIS versi 3 keatas sehingga user harus mendefinisikan secara manual variabel threading BLIS:
#SBATCH --cpus-per-task=//// export BLIS_JC_NT=1 export BLIS_IC_NT=${SLURM_CPUS_PER_TASK} export BLIS_JR_NT=1 export BLIS_IR_NT=1
Penjelasan:
- BLIS JC, IC, JR, dan IR secara urut adalah paralelisasi di loop terluar, loop ketiga, loop kedua, dan loop kesatu.
- Aturan dari variabel BLIS adalah total dari JC * IC * JR * IR harus sama dengan total thread yang didefinisikan user.
- Pada AMD Zen2, karena setiap CCX berkerja pada L3 cache maka paralelisasi dilakukan di level IC sehingga diisi dengan variabel SLURM_CPUS_PER_TASK.
---
Threading BLAS pada OpenBLAS
Threading pada OpenBLAS dideklarasikan melalui variabel OPENBLAS_NUM_THREADS, GOTO_NUM_THREADS, dan OMP_NUM_THREADS:
#SBATCH --cpus-per-task=//// threads=${SLURM_CPUS_PER_TASK} export OPENBLAS_NUM_THREADS=$threads export GOTO_NUM_THREADS=$threads export OMP_NUM_THREADS=${threads}
---
Threading BLAS pada Math Kernel Library (MKL)
Threading pada MKL dideklarasikan melalui variabel OMP_NUM_THREADS dan MKL_NUM_THREADS:
#SBATCH --cpus-per-task=//// threads=${SLURM_CPUS_PER_TASK} export OMP_NUM_THREADS=${threads} export MKL_NUM_THREADS=${threads
Hybrid MPI/OMP
Threading pada hybrid MPI/OMP dilakukan dengan alur berikut:
#SBATCH --nodes=//// #SBATCH --ntasks=//// #SBATCH --cpus-per-task=//// export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx //// # Total SLURM_NTASKS = ntasks * cpus-per-task
- Variabel SLURM_NTASKS secara otomatis akan akan menangkap total core thread CPU yang terpakai yaitu jumlah ntasks * cpus-per-task.
- Pada penggunaan MPI multi-node, SLURM secara otomatis akan mengatur jumlah threading OMP ke setiap proses MPI (atau ntasks).
User juga dapat menggunakan alternatif ntasks-per-node yang lebih kompleks dimana variabel SLURM_NTASKS akan menangkap total core thread CPU yang terpakai yaitu jumlah nodes * ntasks-per-node * cpus-per-task.
#SBATCH --nodes=//// #SBATCH --ntasks-per-node=//// #SBATCH --cpus-per-task=//// export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx //// # Total SLURM_NTASKS = nodes * ntasks-per-node * cpus-per-task