Jump to content

Mpirun arguments: Difference between revisions

From Haidhi Wiki
Created page with "Target ini menjalankan program <code>matmul</code> di beberapa laptop (x86 only) lewat jaringan lokal, menggunakan Open MPI dengan hostfile. == Perintah yang dijalankan == <pre> mpirun --prefix /home/haidhi/ompi4 \ --mca btl_tcp_if_include 192.168.100.0/24 \ --mca oob_tcp_if_include 192.168.100.0/24 \ --hostfile hostfile \ -np 2 \ build/matmul 2048 2048 2048 </pre> (Nilai default. Bisa di-override: <code>make run-host NP=4 M=1024 K=1..."
 
No edit summary
 
Line 1: Line 1:
Target ini menjalankan program <code>matmul</code> di beberapa laptop (x86 only) lewat jaringan lokal, menggunakan Open MPI dengan hostfile.
== Perintah yang dijalankan ==
<pre>
<pre>
mpirun --prefix /home/haidhi/ompi4 \
mpirun \
      --mca btl_tcp_if_include 192.168.100.0/24 \
  --mca btl_tcp_if_include 192.168.100.0/24 \
      --mca oob_tcp_if_include 192.168.100.0/24 \
  --mca oob_tcp_if_include 192.168.100.0/24 \
      --hostfile hostfile \
  --mca hwloc_base_binding_policy none \
      -np 2 \
  --prefix /data/data/com.termux/files/usr \
      build/matmul 2048 2048 2048
  --host 192.168.100.1,192.168.100.2 -np 2 build/matmul 2048 2048 2048 \
  : --host 192.168.100.3 -np 1 ~/matmul-src/phone_launch.sh 2048 2048 2048
</pre>
</pre>


(Nilai default. Bisa di-override: <code>make run-host NP=4 M=1024 K=1024 N=1024</code>)
(Nilai default. Bisa di-override: <code>make cluster NP=2 NP_PHONE=1 M=1024 K=1024 N=1024</code>)


== Penjelasan tiap flag ==
== Penjelasan tiap flag ==


=== <code>--prefix /home/haidhi/ompi4</code> ===
=== <code>--mca btl_tcp_if_include 192.168.100.0/24</code> ===


Memberitahu mpirun di mana instalasi Open MPI berada — di sini <code>/home/haidhi/ompi4</code>, bukan sistem default <code>/usr</code>.
Membatasi BTL (Byte Transfer Layer) TCP agar hanya pakai network interface yang masuk subnet <code>192.168.100.0/24</code>.


'''Kenapa perlu:''' Saat mpirun di master meluncurkan proses di node lain lewat SSH, ia perlu tahu path mpirun, library, dan binary Open MPI yang harus digunakan di remote node. Tanpa <code>--prefix</code>, remote node akan mencoba mencari Open MPI di PATH default-nya, yang mungkin versi berbeda atau tidak ada sama sekali. Dengan ini, semua node dijamin pakai instalasi yang sama.
BTL adalah lapisan Open MPI yang mengerjakan transfer data aktual — semua <code>MPI_Send</code>, <code>MPI_Bcast</code>, <code>MPI_Scatterv</code>, dll lewat sini.


=== <code>--mca btl_tcp_if_include 192.168.100.0/24</code> ===
'''Kenapa perlu:''' Tiap laptop/HP biasanya punya banyak interface (WiFi, loopback, Docker virtual, VPN). Tanpa pembatasan ini, Open MPI bisa salah pilih interface yang tidak terhubung ke semua node, sehingga koneksi data gagal.


Membatasi '''BTL (Byte Transfer Layer)''' komponen TCP agar hanya menggunakan interface jaringan yang ada di subnet <code>192.168.100.0/24</code>.
=== <code>--mca oob_tcp_if_include 192.168.100.0/24</code> ===
 
BTL adalah lapisan di Open MPI yang menangani transfer data antar proses. MPI mendukung beberapa BTL (TCP, shared memory, InfiniBand, dll). Khusus BTL TCP, flag ini menentukan interface mana yang boleh dipakai.


'''Kenapa perlu:''' Laptop biasanya punya lebih dari satu network interface — misalnya WiFi (<code>wlan0</code>), ethernet (<code>eth0</code>), loopback (<code>lo</code>), bahkan interface virtual dari Docker atau VPN. Tanpa pembatasan ini, Open MPI bisa salah memilih interface (misal WiFi lambat, atau VPN yang tidak terhubung ke node lain). Dengan menentukan subnet cluster, kita paksa semua transfer data MPI lewat interface yang benar.
Membatasi OOB (Out-of-Band) TCP ke subnet yang sama.


=== <code>--mca oob_tcp_if_include 192.168.100.0/24</code> ===
OOB adalah kanal kontrol MPI — dipakai untuk handshake startup, sinkronisasi barrier, dan koordinasi antar proses, bukan untuk transfer data matmul.


Membatasi '''OOB (Out-of-Band)''' TCP agar hanya menggunakan interface di subnet <code>192.168.100.0/24</code>.
'''Kenapa perlu:''' Jika OOB dan BTL pakai interface berbeda, bisa terjadi kontrol berhasil tapi data transfer gagal, atau routing tidak konsisten antar node. Keduanya harus di-pin ke subnet yang sama.


OOB adalah kanal kontrol MPI — dipakai untuk koordinasi seperti handshake startup, sinkronisasi, dan pesan manajemen proses. Berbeda dari BTL yang menangani data, OOB menangani sinyal pengendali.
=== <code>--mca hwloc_base_binding_policy none</code> ===


'''Kenapa perlu:''' Alasan yang sama dengan BTL — cegah OOB salah interface. Jika OOB pakai interface yang berbeda dari BTL, bisa terjadi situasi di mana kontrol berhasil tapi data transfer gagal, atau koneksi drop karena routing tidak konsisten. Keduanya harus di-pin ke subnet yang sama.
Menonaktifkan CPU binding (affinity) yang dilakukan hwloc.


'''Perbedaan BTL vs OOB:'''
Secara default, Open MPI mencoba mem-bind tiap proses MPI ke core CPU tertentu menggunakan hwloc. Di cluster heterogen (x86 laptop + ARM Android/Termux), hwloc di HP sering membaca topologi CPU yang berbeda atau tidak lengkap, sehingga binding gagal dan proses tidak bisa jalan.


{| class="wikitable"
'''Kenapa perlu:''' Tanpa flag ini, mpirun bisa abort dengan error hwloc saat meluncurkan proses di HP Android karena Termux tidak mengekspos topologi CPU dengan cara yang sama seperti Linux biasa. Dengan <code>none</code>, OS yang menentukan sendiri di core mana proses berjalan.
|-
! Komponen !! Fungsi !! Analogi
|-
| BTL TCP || Transfer data MPI (<code>MPI_Send</code>, <code>MPI_Bcast</code>, dll) || Truk pengangkut barang
|-
| OOB TCP || Koordinasi dan kontrol proses MPI || Dispatcher yang mengatur truk
|}


=== <code>--hostfile hostfile</code> ===
=== <code>--prefix /data/data/com.termux/files/usr</code> ===


Menentukan file yang berisi daftar node (hostname/IP) yang akan digunakan beserta jumlah slot (proses) per node.
Menentukan path instalasi Open MPI yang digunakan di semua node, termasuk HP Android.


Contoh isi file <code>hostfile</code>:
'''Kenapa pakai path Termux, bukan <code>/home/haidhi/ompi4</code>:''' Path ini adalah path yang valid di HP Android (Termux). Di tiap laptop dibuat symlink:
<pre>
<pre>
192.168.100.1 slots=2
sudo ln -s /home/haidhi/ompi4 /data/data/com.termux/files/usr
192.168.100.2 slots=2
</pre>
</pre>
Jadi path yang sama (<code>/data/data/com.termux/files/usr</code>) resolve ke Open MPI yang benar di semua node — laptop maupun HP — tanpa perlu prefix berbeda per node.
=== <code>--host 192.168.100.1,192.168.100.2 -np 2</code> ===
Menjalankan <code>-np 2</code> proses MPI yang dibagi ke host <code>192.168.100.1</code> dan <code>192.168.100.2</code> (dua laptop x86).
Berbeda dari <code>--hostfile</code>, <code>--host</code> langsung menyebutkan IP di command line. Jumlah slot per host diambil dari default atau bisa diatur dengan <code>host:slot</code> (misal <code>192.168.100.1:2</code>).
=== <code>:</code> (titik dua / MPMD separator) ===
Tanda <code>:</code> ini adalah pemisah MPMD (Multiple Program Multiple Data).
Dengan MPMD, satu perintah <code>mpirun</code> bisa meluncurkan program yang '''berbeda''' di kelompok node yang berbeda dalam satu MPI job yang sama. Semua proses di kedua sisi <code>:</code> masuk ke <code>MPI_COMM_WORLD</code> yang sama dan bisa saling berkomunikasi.


'''Kenapa perlu:''' Memberitahu mpirun node mana saja yang tersedia di cluster dan berapa proses maksimum yang boleh di-spawn di tiap node.
'''Kenapa perlu:''' HP Android punya arsitektur ARM (aarch64), sehingga binary x86 tidak bisa dijalankan di sana. HP punya binary-nya sendiri (<code>phone_launch.sh</code> yang memanggil binary ARM). MPMD memungkinkan laptop pakai <code>build/matmul</code> (x86) dan HP pakai <code>phone_launch.sh</code> (ARM) — tapi tetap dalam satu MPI job yang terpadu.


=== <code>-np 2</code> ===
=== <code>--host 192.168.100.3 -np 1 ~/matmul-src/phone_launch.sh</code> ===


'''Number of Processes''' — total jumlah proses MPI yang akan dijalankan.
Menjalankan 1 proses MPI di HP Android (<code>192.168.100.3</code>), mengeksekusi <code>phone_launch.sh</code> sebagai gantinya binary laptop.


'''Kenapa perlu:''' MPI bekerja dengan model SPMD (Single Program Multiple Data) — program yang sama dijalankan di <code>NP</code> proses secara paralel. Masing-masing proses mendapat rank unik (0, 1, ..., NP-1) dan mengerjakan bagian matriks yang berbeda. Semakin besar NP (selama ada node yang tersedia), semakin banyak baris matriks A yang dikerjakan paralel.
<code>phone_launch.sh</code> berisi perintah untuk menjalankan binary ARM yang sudah dicompile di HP saat <code>make deploy-android</code>.


=== <code>build/matmul 2048 2048 2048</code> ===
== Topologi cluster ==


Binary yang dijalankan beserta argumennya: ukuran matriks M×K dan K×N. Nilai ini diteruskan ke semua proses MPI sebagai <code>argv</code>.
<pre>
mpirun (master: 192.168.100.1)
  │
  ├── rank 0 → 192.168.100.1  (laptop 1, x86)  build/matmul
  ├── rank 1 → 192.168.100.2  (laptop 2, x86)  build/matmul
  └── rank 2 → 192.168.100.3  (HP Android, ARM) phone_launch.sh
</pre>


== Variabel yang bisa di-override ==
== Variabel yang bisa di-override ==
Line 77: Line 83:
! Variabel !! Default !! Keterangan
! Variabel !! Default !! Keterangan
|-
|-
| <code>NP</code> || <code>2</code> || Total proses MPI
| <code>NP</code> || <code>2</code> || Proses MPI di laptop
|-
| <code>NP_PHONE</code> || <code>1</code> || Proses MPI di HP
|-
|-
| <code>M</code> || <code>2048</code> || Baris matriks A / C
| <code>M</code> || <code>2048</code> || Baris matriks A / C
Line 85: Line 93:
| <code>N</code> || <code>2048</code> || Kolom matriks B / C
| <code>N</code> || <code>2048</code> || Kolom matriks B / C
|-
|-
| <code>OMPI_PREFIX</code> || <code>/home/haidhi/ompi4</code> || Path instalasi Open MPI
| <code>LAPTOPS</code> || <code>192.168.100.1,192.168.100.2</code> || IP laptop
|-
|-
| <code>CLUSTER_NET</code> || <code>192.168.100.0/24</code> || Subnet cluster
| <code>ANDROID_IP</code> || <code>192.168.100.3</code> || IP HP Android
|-
|-
| <code>HOSTFILE</code> || <code>hostfile</code> || Path ke hostfile
| <code>CLUSTER_PREFIX</code> || <code>/data/data/com.termux/files/usr</code> || Path Open MPI
|}
|}
Contoh:
<pre>
make run-host NP=4 M=1024 K=1024 N=1024
</pre>

Latest revision as of 10:55, 17 June 2026

mpirun \
  --mca btl_tcp_if_include 192.168.100.0/24 \
  --mca oob_tcp_if_include 192.168.100.0/24 \
  --mca hwloc_base_binding_policy none \
  --prefix /data/data/com.termux/files/usr \
  --host 192.168.100.1,192.168.100.2 -np 2 build/matmul 2048 2048 2048 \
  : --host 192.168.100.3 -np 1 ~/matmul-src/phone_launch.sh 2048 2048 2048

(Nilai default. Bisa di-override: make cluster NP=2 NP_PHONE=1 M=1024 K=1024 N=1024)

Penjelasan tiap flag

--mca btl_tcp_if_include 192.168.100.0/24

Membatasi BTL (Byte Transfer Layer) TCP agar hanya pakai network interface yang masuk subnet 192.168.100.0/24.

BTL adalah lapisan Open MPI yang mengerjakan transfer data aktual — semua MPI_Send, MPI_Bcast, MPI_Scatterv, dll lewat sini.

Kenapa perlu: Tiap laptop/HP biasanya punya banyak interface (WiFi, loopback, Docker virtual, VPN). Tanpa pembatasan ini, Open MPI bisa salah pilih interface yang tidak terhubung ke semua node, sehingga koneksi data gagal.

--mca oob_tcp_if_include 192.168.100.0/24

Membatasi OOB (Out-of-Band) TCP ke subnet yang sama.

OOB adalah kanal kontrol MPI — dipakai untuk handshake startup, sinkronisasi barrier, dan koordinasi antar proses, bukan untuk transfer data matmul.

Kenapa perlu: Jika OOB dan BTL pakai interface berbeda, bisa terjadi kontrol berhasil tapi data transfer gagal, atau routing tidak konsisten antar node. Keduanya harus di-pin ke subnet yang sama.

--mca hwloc_base_binding_policy none

Menonaktifkan CPU binding (affinity) yang dilakukan hwloc.

Secara default, Open MPI mencoba mem-bind tiap proses MPI ke core CPU tertentu menggunakan hwloc. Di cluster heterogen (x86 laptop + ARM Android/Termux), hwloc di HP sering membaca topologi CPU yang berbeda atau tidak lengkap, sehingga binding gagal dan proses tidak bisa jalan.

Kenapa perlu: Tanpa flag ini, mpirun bisa abort dengan error hwloc saat meluncurkan proses di HP Android karena Termux tidak mengekspos topologi CPU dengan cara yang sama seperti Linux biasa. Dengan none, OS yang menentukan sendiri di core mana proses berjalan.

--prefix /data/data/com.termux/files/usr

Menentukan path instalasi Open MPI yang digunakan di semua node, termasuk HP Android.

Kenapa pakai path Termux, bukan /home/haidhi/ompi4: Path ini adalah path yang valid di HP Android (Termux). Di tiap laptop dibuat symlink:

sudo ln -s /home/haidhi/ompi4 /data/data/com.termux/files/usr

Jadi path yang sama (/data/data/com.termux/files/usr) resolve ke Open MPI yang benar di semua node — laptop maupun HP — tanpa perlu prefix berbeda per node.

--host 192.168.100.1,192.168.100.2 -np 2

Menjalankan -np 2 proses MPI yang dibagi ke host 192.168.100.1 dan 192.168.100.2 (dua laptop x86).

Berbeda dari --hostfile, --host langsung menyebutkan IP di command line. Jumlah slot per host diambil dari default atau bisa diatur dengan host:slot (misal 192.168.100.1:2).

: (titik dua / MPMD separator)

Tanda : ini adalah pemisah MPMD (Multiple Program Multiple Data).

Dengan MPMD, satu perintah mpirun bisa meluncurkan program yang berbeda di kelompok node yang berbeda dalam satu MPI job yang sama. Semua proses di kedua sisi : masuk ke MPI_COMM_WORLD yang sama dan bisa saling berkomunikasi.

Kenapa perlu: HP Android punya arsitektur ARM (aarch64), sehingga binary x86 tidak bisa dijalankan di sana. HP punya binary-nya sendiri (phone_launch.sh yang memanggil binary ARM). MPMD memungkinkan laptop pakai build/matmul (x86) dan HP pakai phone_launch.sh (ARM) — tapi tetap dalam satu MPI job yang terpadu.

--host 192.168.100.3 -np 1 ~/matmul-src/phone_launch.sh

Menjalankan 1 proses MPI di HP Android (192.168.100.3), mengeksekusi phone_launch.sh sebagai gantinya binary laptop.

phone_launch.sh berisi perintah untuk menjalankan binary ARM yang sudah dicompile di HP saat make deploy-android.

Topologi cluster

mpirun (master: 192.168.100.1)
  │
  ├── rank 0 → 192.168.100.1  (laptop 1, x86)  build/matmul
  ├── rank 1 → 192.168.100.2  (laptop 2, x86)  build/matmul
  └── rank 2 → 192.168.100.3  (HP Android, ARM) phone_launch.sh

Variabel yang bisa di-override

Variabel Default Keterangan
NP 2 Proses MPI di laptop
NP_PHONE 1 Proses MPI di HP
M 2048 Baris matriks A / C
K 2048 Kolom A / baris B
N 2048 Kolom matriks B / C
LAPTOPS 192.168.100.1,192.168.100.2 IP laptop
ANDROID_IP 192.168.100.3 IP HP Android
CLUSTER_PREFIX /data/data/com.termux/files/usr Path Open MPI