Threading di ALELEON Supercomputer

Dari ALELEON by EFISON

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.

Menjalankan Program 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=////

Menjalankan Program Paralelisasi BLAS

Secara umum, program yang menggunakan threading BLAS (seperti AMD BLIS, OpenBLAS, MKL) dapat berjalan secara multi-core sehingga perhatikan bahwa total core thread CPU yang digunakan adalah:

Total core = ntasks * cpus-per-task

---

Jumlah Thread Optimal

Berdasarkan arsitektur CPU AMD Zen2, admin EFISON merekomendasikan jumlah threading 4 atau 8 per ntasks.

Kombinasi ntasks cpus-per-task
Thread 4 //// 4
Thread 8 //// 8

Dalam menjalankan program threading, jumlah thread mempengaruhi performa jalannya program, artinya kombinasi Thread 4 bisa lebih baik dari Thread 8 atau sebaliknya. Hal ini sepenuhnya tergantung dengan jenis program yang dijalankan. Bagaimana cara user memilih jumlah thread yang paling optimal? Rekomendasi admin EFISON: Uji menjalankan program user dengan input skala kecil pada 4 atau 8 thread per core, bandingkan performanya, dan gunakan jumlah thread yang menghasilkan performa tercepat.

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

Threading AMD BLIS dilakukan dengan komponen utama berikut pada SLURM Script:

#SBATCH --nodes=1
#SBATCH --ntasks=////
#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. Threading OpenBLAS dilakukan dengan komponen utama berikut pada SLURM Script:

#SBATCH --nodes=1
#SBATCH --ntasks=////
#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. Threading MKL dilakukan dengan komponen utama berikut pada SLURM Script:

#SBATCH --nodes=1
#SBATCH --ntasks=////
#SBATCH --cpus-per-task=////

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

Mejalankan Program Hybrid MPI/OMP atau MPI/BLAS

Program MPI dapat digabung dengan paralelisasi threading OMP atau BLAS membentuk program hybrid MPI. Program MPI hybrid OMP (MPI/OMP) dan BLAS (MPI/BLAS) juga dapat berjalan multi-core sekaligus multi-node, sehingga total core thread CPU yang digunakan adalah:

Total core = ntasks * cpus-per-task

Adapun aturan jumlah proses MPI menggunakan jumlah ntasks, bukan total core ntasks * cpus-per-task.

---

Jumlah Thread Optimal

Bagaimana jumlah thread mempengaruhi performa dan memilih jumlah thread yang paling cepat pada Hybrid MPI bekerja dengan prinsip yang sama seperti menjalankan paralelisasi BLAS. Padanannya pada Hybrid MPI adalah kombinasi jumlah proses MPI dan thread per core (atau ntasks dan cpus-per-task di SLURM).

Terdapat dua skenario tambahan yaitu Pure MPI dan Pure OMP. Apabila dirangkum menjadi:

Kombinasi ntasks cpus-per-task
Thread 4 //// 4
Thread 8 //// 8
Pure MPI //// 1
Pure OMP 1 ////

4 kemungkinan kombinasi! Apakah user harus menguji semuanya untuk mencari mana yang paling cepat?

  • Pada software komputasi MPI, admin EFISON akan memandu user melalui template dengan memberikan jenis kombinasi terbaik.
  • Pada software yang dibuat sendiri oleh user, tidak ada cara lain selain menguji semua kombinasinya - disarankan melalui perangkat komputer pribadi.
  • Untuk kali ini tidak ada rule of thumb untuk generalisasi penggunaan. Efisiensi program hybrid MPI bergantung dengan algoritma dan penulisan programnya.

---

Hybrid MPI/OMP

Hybrid MPI/OMP dilakukan dengan komponen utama berikut pada SLURM Script:

#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 ////
  • Jumlah proses MPI tetap menggunakan jumlah ntasks (melalui SLURM_NTASKS), bukan total core 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 ////

---

Hybrid MPI/BLAS

Alur penulisan MPI/BLAS sama seperti MPI/OMP dengan mengganti environment variable threading untuk jenis BLAS yang digunakan. Contoh komponen utama SLURM Script untuk Hybrid MPI dengan AMD BLIS:

#SBATCH --nodes=////
#SBATCH --ntasks=////
#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

mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx ////