Bend - Bahasa Tingkat Tinggi yang Berjalan di GPU (menggunakan HVM2)
(github.com/HigherOrderCO)- Bend adalah bahasa pemrograman tingkat tinggi yang mendukung pemrosesan paralel skala besar
- Tidak seperti alternatif tingkat rendah seperti CUDA dan Metal, Bend menawarkan nuansa dan kemampuan bahasa yang ekspresif seperti Python dan Haskell
- Mencakup alokasi objek cepat, fungsi tingkat tinggi dengan dukungan closure penuh, rekursi tanpa batas, bahkan continuation
- Namun tetap berjalan di perangkat keras paralel masif seperti GPU, dan menunjukkan peningkatan kecepatan yang hampir linear sesuai jumlah core
- Sama sekali tidak memerlukan anotasi paralel eksplisit: tidak perlu pembuatan thread, lock, mutex, atau operasi atomik
- Bend ditenagai oleh runtime HVM2
Demo singkat
Menggunakan Bend
Saat ini tidak berjalan di Windows, dan harus menggunakan WSL2 sebagai alternatif.
- Pertama, Anda harus memasang Rust nightly.
- Lalu, Anda harus memasang HVM2 dan Bend:
cargo +nightly install hvm cargo +nightly install bend-lang - Terakhir, Anda dapat menulis file Bend dan menjalankannya dengan salah satu perintah berikut:
bend run # gunakan interpreter Rust (sekuensial) bend run-c # gunakan interpreter C (paralel) bend run-cu # gunakan interpreter CUDA (paralel masif) - Anda juga dapat mengompilasi Bend menjadi file C/CUDA mandiri dengan
gen-cdangen-cuuntuk performa maksimum. Namun, pembuatan kode masih dalam tahap awal dan belum sematang compiler mutakhir seperti GCC atau GHC.
Pemrograman paralel di Bend
- Untuk menulis program paralel di Bend... Anda tidak perlu melakukan apa pun. Asalkan program ditulis agar tidak bersifat sekuensial secara inheren.
- Sebagai contoh, ekspresi berikut tidak dapat dijalankan secara paralel:
karena(((1 + 2) + 3) + 4)+4bergantung pada+3, dan+3bergantung pada(1+2). - Namun, ekspresi berikut dapat dijalankan secara paralel:
karena((1 + 2) + (3 + 4))(1+2)dan(3+4)saling independen. Sesuai prinsip dasar Bend, segala sesuatu yang bisa dijalankan secara paralel akan dijalankan secara paralel.
Contoh kode
-
Sebagai contoh yang lebih lengkap, pertimbangkan kode berikut:
# jaringan pengurutan = rotasi pohon def sort(d, s, tree): switch d: case 0: return tree case _: (x, y) = tree lft = sort(d-1, 0, x) rgt = sort(d-1, 1, y) return rots(d, s, lft, rgt) # rotasi subpohon def rots(d, s, tree): switch d: case 0: return tree case _: (x, y) = tree return down(d, s, warp(d-1, s, x, y)) -
File ini mengimplementasikan pengurut bitonik menggunakan rotasi pohon immutable. Ini bukan algoritma yang biasanya diharapkan berjalan cepat di GPU. Namun, karena menggunakan pendekatan divide-and-conquer, algoritma ini secara inheren paralel. Bend menjalankannya dengan multi-threading. Beberapa benchmark:
- CPU, Apple M3 Max, 1 thread: 12,15 detik
- CPU, Apple M3 Max, 16 thread: 0,96 detik
- GPU, NVIDIA RTX 4090, 16k thread: 0,21 detik
- Peningkatan kecepatan 57x dicapai tanpa melakukan apa pun. Tidak ada pengelolaan eksplisit untuk pembuatan thread, lock, atau mutex. Cukup meminta Bend menjalankan program di RTX.
Dukungan untuk beragam sistem paralel
-
Bend tidak terbatas pada paradigma tertentu seperti tensor atau matriks. Segala jenis sistem paralel, dari shader hingga model aktor seperti Erlang, dapat diemulasikan di Bend.
-
Sebagai contoh, untuk merender gambar secara real-time, Anda dapat mengalokasikan pohon immutable untuk setiap frame:
# bila diberi shader, kembalikan gambar persegi def render(depth, shader): bend d = 0, i = 0: when d < depth: color = (fork(d+1, i*2+0), fork(d+1, i*2+1)) else: width = depth / 2 color = shader(i % width, i / width) return color # bila diberi posisi, kembalikan warna # dalam demo ini, hanya menjalankan busy loop def demo_shader(x, y): bend i = 0: when i < 5000: color = fork(i + 1) else: color = 0x000001 return color # render gambar 256x256 menggunakan demo_shader def main: return render(16, demo_shader) -
Ini benar-benar berfungsi. Bahkan algoritma yang kompleks pun dapat diparalelkan dengan baik di Bend. Komunikasi jarak jauh dilakukan melalui global beta reduction (sesuai interaction calculus), dan disinkronkan secara benar serta efisien oleh atomic linker milik HVM2.
Materi tambahan
- Untuk langsung mulai, lihat GUIDE.md milik Bend.
- Untuk melihat daftar fitur, lihat FEATURES.md.
- Untuk memahami teknologi di balik Bend, lihat paper HVM2.
- Bend dikembangkan oleh HigherOrderCO.com - bergabunglah ke Discord.
Opini GN⁺
- Penyederhanaan pemrograman paralel: Bend sangat menyederhanakan pemrograman paralel, sehingga bahkan software engineer pemula pun dapat mengaksesnya dengan mudah. Ini secara signifikan menurunkan hambatan masuk untuk pemrograman paralel.
- Dukungan perangkat keras yang beragam: Bend dapat berjalan efisien tidak hanya di CPU tetapi juga di GPU, sehingga bisa dimanfaatkan di berbagai lingkungan perangkat keras.
- Bahasa yang ekspresif: Dengan menggabungkan keunggulan Python dan Haskell, Bend memungkinkan penulisan kode yang ekspresif. Ini meningkatkan keterbacaan dan kemudahan pemeliharaan kode.
- Pembuatan kode yang masih tahap awal: Saat ini pembuatan kode di Bend masih berada pada tahap awal, sehingga performanya bisa kalah dibanding compiler yang sudah matang. Ini perlu ditingkatkan ke depannya.
- Dukungan untuk beragam sistem paralel: Bend tidak terbatas pada paradigma tertentu dan mendukung berbagai sistem paralel, sehingga pemrograman yang fleksibel menjadi mungkin. Ini memungkinkan Bend digunakan di berbagai bidang aplikasi.
1 komentar
Opini Hacker News
Ringkasan kumpulan komentar Hacker News
Perbandingan performa Python dan PyPy
Umpan balik positif
Pendapat kritis
Harapan terhadap pemrograman paralel
Perbandingan performa
Harapan terhadap perkembangan proyek
Sudut pandang skeptis
Prospek positif
Karakteristik bahasa Bend