Heterogeneous Cluster: tambah node HP android
Setelah dua laptop saling ngobrol via LAN kabel, langkah ini menambahkan node ketiga yang berbeda di hampir semua sumbu: arsitektur, OS, libc, path instalasi, akses jaringan, dan model driver GPU.
Ringkasan 5W1H
| Aspek | Penjelasan |
|---|---|
| What (Apa) | Menjalankan satu job MPI (perkalian matriks terdistribusi) di tiga node berbeda arsitektur, di mana tiap rank menjalankan kernel OpenCL di device-nya masing-masing: NVIDIA GPU, AMD CPU (pocl), dan Qualcomm Adreno. |
| Why (Kenapa) | Membuktikan komputasi terdistribusi bisa berjalan lintas-arsitektur (x86_64 + ARM64), lintas-OS (Linux + Android), dan lintas-vendor-GPU dalam satu proses MPI. Nilai utamanya adalah sinyal skill cross-stack (portofolio), bukan platform komputasi yang praktis/cepat. |
| Who (Siapa/komponen) | mpirun sebagai HNP di master (darmogandolz) yang meluncurkan orted di tiap node; tiap rank adalah proses MPI yang memanggil OpenCL di device lokalnya. Perangkat: darmogandolz (NVIDIA), tumbal (AMD/pocl), HP (Adreno).
|
| When (Kapan) | Tahap akhir — setelah dua laptop terbukti saling terhubung via LAN kabel. Ini langkah "menambah node ketiga" ke cluster yang sudah jalan. |
| Where (Di mana) | LAN kabel khusus 192.168.100.0/24 lewat switch unmanaged. HP bergabung via adapter USB-to-LAN dengan IP statik 192.168.100.3.
|
| How (Bagaimana) | Cek versi+PMIx pkg (cocok → pakai pkg), SSH port 8022 via ssh config, samakan path via trik symlink terbalik, binary per-arch + MPMD, env OpenCL HP via skrip pembungkus, dan fix kunci: paksa policy routing Android lewat eth0. Diluncurkan via MPMD dengan interface dipin + binding hwloc dimatikan.
|
Lingkungan
| Komponen | darmogandolz (master) | tumbal | HP (Android) |
|---|---|---|---|
| Arsitektur | x86_64 | x86_64 | aarch64 (ARM64) |
| OS / libc | Arch Linux / glibc | Arch Linux / glibc | Android 13 / bionic (Termux) |
| Device OpenCL | NVIDIA RTX 3050 | AMD A8-6410 (pocl, CPU) | Qualcomm Adreno 610 |
| OpenMPI | 4.1.5 (source) | 4.1.5 (source) | 4.1.5 (pkg Termux) |
| Prefix OpenMPI | /home/haidhi/ompi4 |
/home/haidhi/ompi4 |
/data/data/com.termux/files/usr ($PREFIX)
|
| NIC cluster | enp8s0 → 192.168.100.1 | eno1 → 192.168.100.2 | eth0 (USB) → 192.168.100.3 |
| Akses SSH | port 22 | port 22 | port 8022 (Termux sshd) |
Konsep: lima sumbu heterogenitas
HP berbeda dari laptop di hampir semua sumbu sekaligus. Memahami ini menjelaskan kenapa tiap masalah muncul:
- Arsitektur CPU — aarch64 vs x86_64 → binary tidak bisa dipakai bersama, wajib MPMD (binary terpisah per-arch).
- OS/libc — Android(bionic)+Termux vs Linux(glibc) → butuh build/paket sendiri + preload libc++.
- Path instalasi —
$PREFIXvs/home/haidhi/ompi4→ aturan "path sama di semua node" pecah. - Jaringan & akses — USB-LAN + IP statik + sshd di port 8022.
- OpenCL — Adreno non-ICD (vendor-first + libc++ preload) vs ICD sistem di laptop.
Benang merah semua: versi OpenMPI wajib cocok (4.1.5 di semua node).
Ikhtisar masalah
| # | Tahap | Gejala singkat |
|---|---|---|
| 1 | SSH | ssh: connect to host ... port 22: Connection refused
|
| 2 | Kompatibilitas | Apakah pkg Termux bisa interop dengan build source laptop? |
| 3 | Launch | /home/haidhi/ompi4/bin/orted: No such file or directory (di HP)
|
| 4 | Koneksi | unable to complete a TCP connection ... Local host: localhost
|
| 5 | Jaringan | HP tidak bisa menjangkau 192.168.100.1 (routing salah arah)
|
Masalah 1: SSH ke HP ditolak (port)
Muncul saat: mpirun pertama kali mencoba meluncurkan orted di HP. Di mana: master → HP.
Gejala
ssh: connect to host 192.168.100.3 port 22: Connection refused
Penyebab
Termux menjalankan sshd di port 8022, bukan 22. mpirun (lewat ssh) default ke port 22, jadi tidak ada yang mendengarkan. "Connection refused" (bukan timeout) justru kabar baik: HP reachable di level IP, jaringan USB-eth sudah jalan.
Solusi
Beri tahu ssh lewat ~/.ssh/config di master (per-host, jadi laptop tetap port 22):
Host 192.168.100.3
Port 8022
IdentityFile ~/.ssh/id_ed25519
chmod 600 ~/.ssh/config
# di Termux HP: pastikan sshd jalan + public key master terpasang
sshd
cat ~/.ssh/authorized_keys
# verifikasi (WAJIB lolos sebelum mpirun):
ssh 192.168.100.3 'uname -m' # → aarch64, tanpa password
Catatan: jangan pakai --mca plm_rsh_agent "ssh -p 8022" — itu memaksa SEMUA host ke 8022, termasuk laptop di port 22. ssh config per-host yang benar.
Masalah 2: apakah pkg Termux kompatibel?
Muncul saat: memutuskan pakai paket Termux atau build dari source. Di mana: HP.
Pertanyaan
OpenMPI di laptop di-build dari source (4.1.5, prefix custom). Di HP terpasang dari pkg. Antar-node, versi dan build harus cukup cocok agar handshake peluncuran tidak gagal (lihat error "Data unpack" di halaman sebelumnya). Apakah pkg bisa dipakai?
Diagnosis
mpirun --version
ompi_info | grep -iE 'configure command|pmix'
Hasil di HP:
mpirun (Open MPI) 4.1.5
Configure command line: ... '--host=aarch64-linux-android' '--disable-dlopen'
'ac_cv_header_ifaddrs_h=no' ... '--enable-shared' '--enable-static'
MCA pmix: isolated (... Component v4.1.5)
MCA pmix: pmix3x (... Component v4.1.5)
Kesimpulan
Cocok. Versi (4.1.5) dan PMIx (pmix3x internal v4.1.5) identik dengan laptop — ini faktor penentu handshake, dan dia match. Jadi pkg layak dipakai; tidak perlu build dari source.
Dua flag pada build pkg sempat jadi kekhawatiran:
ac_cv_header_ifaddrs_h=no—getifaddrs()dimatikan; deteksi interface jatuh ke fallback (SIOCGIFCONF). Sempat dicurigai bikin HP gagal mengenali IP-nya di multi-node.--disable-dlopen— komponen di-static-link, bukan plugin runtime. Tidak masalah untuk handshake.
Catatan penting (terbukti kemudian): kekhawatiran ifaddrs ternyata tidak terbukti — fallback SIOCGIFCONF membaca eth0 dengan benar. pkg berjalan tanpa modifikasi. Penyebab kegagalan sebenarnya ada di tempat lain (Masalah 5).
Masalah 3: orted tidak ditemukan di HP
Muncul saat: mpirun meluncurkan orted di HP (SSH sudah berhasil). Di mana: HP.
Gejala
/data/data/com.termux/files/usr/bin/bash: line 1: /home/haidhi/ompi4/bin/orted: No such file or directory
Penyebab
Dua hal:
--prefixper-context tidak ke-propagate di OpenMPI 4.1.5. Walau tiap section MPMD diberi--prefixsendiri, mpirun hanya memakai SATU prefix global untuk semua orted. Akibatnya prefix laptop (/home/haidhi/ompi4) dipaksakan ke HP, yang tidak punya path itu.- Tidak bisa membuat
/home/haidhidi Android. Ini bukan soal root — root filesystem/di Android read-only (partisi system + verified boot).sutidak menolong karena mount-nya memang ro; remount rw diblok/merusak boot. Jadi trik symlink "biasa" (bikin path laptop di HP) mati.
Solusi
Balik arah triknya. Karena / di laptop writable tapi di HP tidak, buat path HP di laptop, menunjuk ke instalasi laptop:
# di KEDUA laptop:
sudo mkdir -p /data/data/com.termux/files
sudo ln -s /home/haidhi/ompi4 /data/data/com.termux/files/usr
Sekarang path /data/data/com.termux/files/usr/bin/orted valid di semua node — di HP itu pkg asli, di laptop itu symlink ke ompi4. Lalu pakai SATU --prefix global = path HP (buang per-context):
mpirun ... --prefix /data/data/com.termux/files/usr ...
Tentang executable: di MPMD, path tiap app di-resolve di node masing-masing, dan tiap section menyebut app-nya sendiri, jadi binary boleh beda path antar-arch. Wajib pakai path absolut untuk HP — jangan ~, karena tilde di-expand oleh shell laptop menjadi home laptop sebelum mpirun melihatnya.
Masalah 4 & 5: TCP gagal — sebenarnya routing Android
Muncul saat: orted sudah jalan di semua node, masuk fase komunikasi antar-rank. Di mana: HP ↔ master.
Gejala
A process or daemon was unable to complete a TCP connection to another process:
Local host: localhost
Remote host: darmogandolz
This is usually caused by a firewall on the remote host.
Investigasi: dari HP, ping 192.168.100.1 gagal.
Penyebab
Pesan menuduh firewall, tapi penyebab sebenarnya adalah policy routing Android. Bukti:
su -c 'ip addr show eth0' # 192.168.100.3 ADA, eth0 UP
su -c 'ip route get 192.168.100.1'
# 192.168.100.1 via 192.168.1.1 dev wlan0 table wlan0 src 192.168.1.136
HP mengirim paket untuk 192.168.100.1 lewat WiFi (dev wlan0, via gateway router 192.168.1.1), bukan lewat eth0 — padahal eth0 sudah punya IP di subnet itu. Router WiFi tidak kenal subnet 192.168.100.x, jadi paket nyasar.
Android tidak memakai tabel routing main seperti Linux desktop. Ia memakai banyak tabel + ip rule per-jaringan; rule untuk jaringan WiFi (table wlan0) dibaca lebih dulu, membypass route eth0 yang ada di tabel main. Asimetri ini (inbound via eth0 jalan, outbound lari ke WiFi) yang membuat koneksi TCP balik ke master gagal.
Catatan: "Local host: localhost" hanyalah label hostname default Termux — bukan indikasi masalah ifaddrs. Itu sempat menyesatkan ke arah rebuild source yang sebenarnya tidak perlu.
Solusi
Paksa tujuan 192.168.100.0/24 membaca tabel main (yang punya route eth0), pada prioritas tinggi:
su -c 'ip route replace 192.168.100.0/24 dev eth0 src 192.168.100.3 table main'
su -c 'ip rule add to 192.168.100.0/24 lookup main priority 100'
# verifikasi:
su -c 'ip route get 192.168.100.1' # harus jadi: dev eth0 src 192.168.100.3
Rule prioritas 100 dibaca sebelum rule WiFi Android (~10000-an), memaksa paket ke subnet wired lewat eth0.
Catatan operasional: hanya perlu di HP (laptop Arch routing-nya normal). Android sering me-reset rule ini saat layar mati / USB re-enumerate / reboot — jika putus, terapkan ulang (bisa dibuat skrip). ping mungkin tetap gagal jika laptop men-drop ICMP, tapi itu tidak relevan — MPI memakai TCP, bukan ICMP.
Konfigurasi final yang berhasil
Skrip pembungkus di HP (env OpenCL Adreno)
Rank HP butuh env khusus (vendor-first untuk Adreno + preload libc++), sementara laptop tidak boleh terkena. Dibungkus skrip yang men-set env lalu exec app (path di-hardcode karena env spawn bisa kosong):
#!/data/data/com.termux/files/usr/bin/bash
PREFIX=/data/data/com.termux/files/usr
HOME=/data/data/com.termux/files/home
export LD_LIBRARY_PATH=/vendor/lib64:/system/vendor/lib64:/system/lib64:$PREFIX/lib
export LD_PRELOAD=$PREFIX/lib/libc++_shared.so
exec "$HOME/app_arm" "$@"
Simpan sebagai /data/data/com.termux/files/home/phone_launch.sh, lalu chmod +x. (app_arm = matmul yang dikompilasi di HP untuk ARM.)
Perintah peluncuran (MPMD)
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 ./matmul \
: --host 192.168.100.3 -np 1 /data/data/com.termux/files/home/phone_launch.sh
Penjelasan flag: btl/oob_tcp_if_include mengunci jalur data & kontrol ke subnet wired; hwloc_base_binding_policy none mematikan binding proses (syscall-nya diblok seccomp Android); --prefix tunggal + symlink laptop menyeragamkan path; sintaks : (MPMD) memberi binary berbeda per-arch.
Hasil
Hello World from MPI rank 0/3 on host 'darmogandolz' using OpenCL device 'NVIDIA GeForce RTX 3050 6GB Laptop GPU'
Hello World from MPI rank 2/3 on host 'localhost' using OpenCL device 'QUALCOMM Adreno(TM)'
Hello World from MPI rank 1/3 on host 'tumbal' using OpenCL device 'cpu-ivybridge-AMD A8-6410 APU with AMD Radeon R5 Graphics'
Matrix multiply 512x512 * 512x512 = 512x512 selesai pada 3 proses MPI. Verifikasi: OK ✓
Tiga node, tiga arsitektur/OS, tiga vendor OpenCL, satu job MPI — terverifikasi benar.
Ringkasan
| Masalah | Penyebab inti | Solusi inti |
|---|---|---|
| SSH refused (port 22) | Termux sshd di port 8022 | ~/.ssh/config per-host Port 8022
|
| Kompatibilitas pkg | (ternyata cocok: 4.1.5 + pmix3x internal) | Pakai pkg apa adanya — tidak perlu build source |
| orted not found di HP | per-context prefix tak propagate + / Android read-only |
Symlink terbalik (path HP di laptop) + satu --prefix global
|
| TCP gagal / "localhost" | Policy routing Android (paket wired lari ke WiFi) | ip rule ... lookup main priority 100 + route eth0
|
Catatan / Pelajaran
- pkg ternyata cukup. Faktor penentu interop adalah versi + PMIx, dan keduanya match. Flag
ifaddrs=no/--disable-dlopenyang ditakutkan tidak mematahkan multi-node (fallback SIOCGIFCONF membaca eth0). Jangan rebuild dari source secara prematur — coba pkg dulu. - Blocker terberat justru jaringan Android, bukan MPI. Policy routing yang membypass eth0 adalah penyebab sebenarnya kegagalan TCP, bukan handshake MPI maupun ifaddrs.
- Android
/read-only walau di-root. Karena itu unifikasi path dibalik: buat path HP di laptop (yang writable), bukan sebaliknya. - ping ≠ MPI.
pingmemakai ICMP; banyak host men-drop ICMP tapi menerima TCP. Kegagalan ping bisa menyesatkan — uji TCP langsung (mis.sshke host; sampai prompt password pun berarti TCP nyampe). - "localhost" itu kosmetik. Hanya hostname default Termux, bukan kegagalan pengalamatan. Jika ingin output rapi, set hostname HP.
- Per-context
--prefixtidak bekerja di OpenMPI 4.1.5 untuk peluncuran orted — hanya satu prefix global. Atasi dengan menyeragamkan path (symlink), bukan mengandalkan prefix per-section.