Jump to content

Cara pake OpenCL di Android

From Haidhi Wiki

Panduan memperbaiki masalah clinfo melaporkan "Number of platforms: 0" di Termux pada perangkat Android dengan GPU Qualcomm Adreno. Masalah ini terjadi karena ICD loader OpenCL sudah terpasang, tetapi belum ada driver OpenCL vendor yang terdaftar ke loader tersebut.

Lingkungan yang diuji
Item Keterangan
Perangkat Redmi Note 12 4G
SoC / GPU Snapdragon 685 / Adreno 610
Sistem operasi Android (rooted)
Shell Termux (arsitektur aarch64)

Gejala

Menjalankan clinfo menghasilkan output berikut:

Number of platforms                               0
ICD loader properties
  ICD loader Name                                 OpenCL ICD Loader
  ICD loader Vendor                               OCL Icd free software
  ICD loader Version                              2.3.5
  ICD loader Profile                              OpenCL 3.1

ICD loader terdeteksi normal, tetapi jumlah platform 0 — artinya tidak ada implementasi OpenCL (driver) yang ditemukan oleh loader.

Penyebab

Pada Android, driver OpenCL untuk GPU Adreno sudah tersedia dalam bentuk libOpenCL.so milik Qualcomm di partisi vendor. Namun, ICD loader bawaan Termux (ocl-icd) tidak mengetahui lokasi driver tersebut karena belum ada berkas ICD (*.icd) yang menunjuk ke sana.

Catatan: Terdapat dua berkas bernama libOpenCL.so pada sistem — satu milik Termux (berperan sebagai loader, yaitu yang dipanggil oleh clinfo) dan satu milik Qualcomm (driver asli di /vendor). Yang perlu didaftarkan adalah milik Qualcomm.

Persyaratan

  • Perangkat Android dengan GPU Adreno yang mendukung OpenCL (seri Adreno 6xx ke atas umumnya mendukung OpenCL Full Profile).
  • Termux dengan paket clinfo dan ICD loader (ocl-icd) sudah terpasang.
  • Akses root disarankan (membantu pada beberapa kasus pemuatan library vendor).

Solusi

1. Temukan lokasi driver

ls -l /vendor/lib64/libOpenCL.so /system/vendor/lib64/libOpenCL.so /system/lib64/libOpenCL.so 2>/dev/null

# Jika ragu, scan menyeluruh:
find /vendor /system -iname 'libOpenCL*.so' 2>/dev/null

Catat path yang muncul (umumnya /vendor/lib64/libOpenCL.so).

2. Daftarkan driver sebagai ICD

mkdir -p $PREFIX/etc/OpenCL/vendors
echo /vendor/lib64/libOpenCL.so > $PREFIX/etc/OpenCL/vendors/adreno.icd

Sesuaikan path dengan hasil langkah 1.

3. Arahkan linker ke library dependensi

Driver vendor membutuhkan berkas .so lain yang berada di /vendor/lib64:

export LD_LIBRARY_PATH=/vendor/lib64:/system/vendor/lib64:/system/lib64${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}

4. Uji

clinfo | head -20

Jika berhasil, Number of platforms menjadi 1 dan muncul nama seperti QUALCOMM Snapdragon / Adreno (TM) 610.

5. Membuat pengaturan permanen

Tambahkan ke ~/.bashrc agar tidak perlu mengetik ulang setiap membuka Termux:

echo 'export LD_LIBRARY_PATH=/vendor/lib64:/system/vendor/lib64:/system/lib64${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}' >> ~/.bashrc

Troubleshooting

Jika platform masih 0, aktifkan mode debug pada loader untuk melihat penyebab kegagalan:

OCL_ICD_DEBUG=15 clinfo 2>&1 | head -40

Berdasarkan pesan yang muncul:

Berkas ICD seperti tidak terbaca (platform tetap 0)
Paksa direktori vendor lalu ulangi pengujian: export OCL_ICD_VENDORS=$PREFIX/etc/OpenCL/vendors
... not accessible for the namespace "(default)"
Android memblokir pemuatan library vendor dari aplikasi. Karena perangkat sudah root, jalankan sebagai root: pasang tsu melalui pkg install tsu, lalu jalankan sudo env LD_LIBRARY_PATH=/vendor/lib64:/system/lib64 clinfo.
cannot locate symbol / undefined reference
Ada dependensi yang kurang. Periksa dengan readelf -d /vendor/lib64/libOpenCL.so | grep NEEDED (perlu pkg install binutils), lalu tambahkan folder library terkait (mis. /odm/lib64) ke LD_LIBRARY_PATH.
Arsitektur tidak cocok
Pastikan Termux 64-bit — dpkg --print-architecture harus menghasilkan aarch64 — agar sesuai dengan library di lib64. Jika Termux 32-bit, gunakan /vendor/lib/libOpenCL.so (tanpa 64).

Memakai berkas ICD bawaan ROM

Beberapa ROM sudah menyertakan berkas ICD sendiri yang menunjuk ke driver asli:

cat /vendor/etc/OpenCL/vendors/*.icd /system/etc/OpenCL/vendors/*.icd 2>/dev/null

Jika ada isinya, gunakan path tersebut pada langkah 2.

Catatan

  • Jika perintah find pada langkah 1 sama sekali tidak menemukan libOpenCL.so, kemungkinan ROM (umumnya custom ROM) telah membuang blob OpenCL. Berkas tersebut perlu ditarik manual dari stock ROM (MIUI/HyperOS).
  • GPU seri Adreno 6xx mendukung OpenCL Full Profile; performa nyata bergantung pada model GPU dan versi driver.