Threading di ALELEON Supercomputer: Perbedaan antara revisi

Dari ALELEON by EFISON
(Initial page - copy dari halaman optimasi ALELEON)
 
(memecah section ke paralelisasi BLAS dan Hybrid)
Baris 9: Baris 9:
  export OMP_NUM_THREADS='''$SLURM_CPUS_PER_TASK'''
  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.  
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'''==
=='''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.
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 --nodes=1
  #SBATCH --ntasks=1
  #SBATCH --ntasks=1
  #SBATCH --cpus-per-task=////
  #SBATCH --cpus-per-task=////
=='''Paralelisasi BLAS''' ==
=='''Menjalankan Program Paralelisasi BLAS''' ==
Bagian ini digunakan untuk user yang melakukan compile program dengan komponen library 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 ===
=== 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.'''[[Berkas:Ccxccd.png|nir|jmpl|285x285px|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.|pra=https://wiki.efisonlt.com/wiki/Berkas:Ccxccd.png]]---
Berdasarkan arsitektur CPU AMD Zen2, admin EFISON merekomendasikan '''jumlah threading 4 atau 8 per ntasks.'''  
{| class="wikitable"
!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.[[Berkas:Ccxccd.png|nir|jmpl|285x285px|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.|pra=https://wiki.efisonlt.com/wiki/Berkas:Ccxccd.png]]---
===Threading BLAS pada AMD BLIS===
===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:
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=////
  #SBATCH --cpus-per-task=////
   
   
Baris 35: Baris 53:
---
---
===Threading BLAS pada OpenBLAS===
===Threading BLAS pada OpenBLAS===
Threading pada OpenBLAS dideklarasikan melalui variabel OPENBLAS_NUM_THREADS, GOTO_NUM_THREADS, dan OMP_NUM_THREADS:
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=////
  #SBATCH --cpus-per-task=////
   
   
Baris 44: Baris 64:
---
---
===Threading BLAS pada Math Kernel Library (MKL)===
===Threading BLAS pada Math Kernel Library (MKL)===
Threading pada MKL dideklarasikan melalui variabel OMP_NUM_THREADS dan MKL_NUM_THREADS:
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=////
  #SBATCH --cpus-per-task=////
   
   
  threads=${SLURM_CPUS_PER_TASK}
  threads=${SLURM_CPUS_PER_TASK}
  export OMP_NUM_THREADS=${threads}
  export OMP_NUM_THREADS=${threads}
  export MKL_NUM_THREADS=${threads
  export MKL_NUM_THREADS=${threads}
=='''Hybrid MPI/OMP'''==
=='''Mejalankan Program Hybrid MPI/OMP atau MPI/BLAS'''==
Threading pada hybrid MPI/OMP dilakukan dengan alur berikut:
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:
{| class="wikitable"
!Kombinasi
!ntasks
!cpus-per-task
|-
|Thread 4
|////
|4
|-
|Thread 8
|////
|8
|-
|'''Pure MPI'''
|'''////'''
|'''1'''
|-
|'''Pure OMP'''
|'''1'''
|'''////'''
|}
'''4 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 --nodes=////
  #SBATCH --ntasks=////
  #SBATCH --ntasks=////
Baris 59: Baris 120:
   
   
  mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx ////
  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.'''
*'''Jumlah proses MPI tetap menggunakan jumlah ntasks''' (melalui SLURM_NTASKS), bukan total core ntasks * cpus-per-task.
*Pada penggunaan [https://wiki.efisonlt.com/wiki/MPI_ALELEON_Supercomputer#MPI_Satu_Node_vs_Multi_Node MPI multi-node], SLURM secara otomatis akan mengatur jumlah threading OMP ke setiap proses MPI (atau ntasks).
*Pada penggunaan [https://wiki.efisonlt.com/wiki/MPI_ALELEON_Supercomputer#MPI_Satu_Node_vs_Multi_Node 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'''.
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'''.
Baris 70: Baris 131:
   
   
  mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx ////
  mpirun -np $SLURM_NTASKS --mca pml ucx --mca osc ucx ////
'''# Total SLURM_NTASKS = nodes * ntasks-per-node * cpus-per-task'''

Revisi per 8 Februari 2022 06.19

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 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 ////