Threading di ALELEON Supercomputer

Dari ALELEON by EFISON

Revisi sejak 8 Februari 2022 03.35 oleh WilsonLisan (bicara | kontrib) (Initial page - copy dari halaman optimasi ALELEON)
(beda) ← Revisi sebelumnya | Revisi terkini (beda) | Revisi selanjutnya → (beda)

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 dan MPI/OMP paling optimal disebar ke setiap core fisik di CCX atau CCD sehingga admin EFISON merekomendasikan jumlah threading 2, 4, atau 8.

---

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