Bend - Ngôn ngữ bậc cao chạy trên GPU (dùng HVM2)
(github.com/HigherOrderCO)- Bend là một ngôn ngữ lập trình bậc cao hỗ trợ xử lý song song quy mô lớn
- Không giống các lựa chọn cấp thấp như CUDA và Metal, Bend mang lại cảm giác và tính năng của các ngôn ngữ giàu khả năng biểu đạt như Python và Haskell
- Có cấp phát đối tượng nhanh, hàm bậc cao với hỗ trợ closure đầy đủ, đệ quy không giới hạn, thậm chí cả continuations
- Tuy nhiên, nó chạy trên phần cứng song song quy mô lớn như GPU và cho thấy mức tăng tốc gần tuyến tính theo số lượng lõi
- Hoàn toàn không cần chú thích song song tường minh: không cần tạo thread, lock, mutex hay phép toán nguyên tử
- Bend được vận hành bởi runtime HVM2
Demo nhanh
Sử dụng Bend
Hiện chưa hoạt động trên Windows, cần dùng WSL2 như một giải pháp thay thế.
- Trước tiên, cần cài đặt Rust nightly.
- Sau đó, cần cài đặt HVM2 và Bend:
cargo +nightly install hvm cargo +nightly install bend-lang - Cuối cùng, có thể viết một file Bend và chạy bằng một trong các lệnh sau:
bend run # dùng trình thông dịch Rust (tuần tự) bend run-c # dùng trình thông dịch C (song song) bend run-cu # dùng trình thông dịch CUDA (song song quy mô lớn) - Ngoài ra, có thể dùng
gen-cvàgen-cuđể biên dịch Bend thành file C/CUDA độc lập nhằm đạt hiệu năng tối đa. Tuy nhiên, việc sinh mã vẫn đang ở giai đoạn đầu và chưa trưởng thành như các trình biên dịch tiên tiến như GCC hay GHC.
Lập trình song song trong Bend
- Để viết chương trình song song trong Bend... không cần làm gì cả. Chỉ cần viết sao cho nó không mang tính tuần tự một cách cố hữu.
- Ví dụ, biểu thức sau không thể chạy song song:
vì(((1 + 2) + 3) + 4)+4phụ thuộc vào+3, và+3lại phụ thuộc vào(1+2). - Nhưng biểu thức sau có thể chạy song song:
vì((1 + 2) + (3 + 4))(1+2)và(3+4)là độc lập. Theo nguyên lý cốt lõi của Bend, mọi thứ có thể chạy song song đều sẽ được chạy song song.
Mã ví dụ
-
Để có một ví dụ đầy đủ hơn, hãy xem đoạn mã sau:
# mạng sắp xếp = xoay cây 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) # xoay cây con 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 này triển khai một bộ sắp xếp bitonic dùng xoay cây bất biến. Đây không phải là thuật toán được kỳ vọng chạy nhanh trên GPU. Tuy nhiên, vì sử dụng cách tiếp cận chia để trị nên nó mang tính song song bẩm sinh. Bend sẽ chạy nó bằng đa luồng. Một vài benchmark:
- CPU, Apple M3 Max, 1 thread: 12.15 giây
- CPU, Apple M3 Max, 16 thread: 0.96 giây
- GPU, NVIDIA RTX 4090, 16k thread: 0.21 giây
- Đạt được tăng tốc 57 lần mà không cần làm gì cả. Không có quản lý tường minh việc tạo thread, lock hay mutex. Chỉ đơn giản là yêu cầu Bend chạy chương trình trên RTX.
Hỗ trợ nhiều hệ thống song song
-
Bend không bị giới hạn trong các mô hình cụ thể như tensor hay ma trận. Mọi hệ thống song song, từ shader đến mô hình actor kiểu Erlang, đều có thể được mô phỏng trong Bend.
-
Ví dụ, để render hình ảnh theo thời gian thực, có thể cấp phát một cây bất biến cho mỗi frame:
# cho một shader, trả về một ảnh hình chữ nhật 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 # cho một vị trí, trả về màu sắc # trong demo này chỉ đơn giản chạy một vòng lặp bận def demo_shader(x, y): bend i = 0: when i < 5000: color = fork(i + 1) else: color = 0x000001 return color # render ảnh 256x256 bằng demo_shader def main: return render(16, demo_shader) -
Điều này thực sự hoạt động. Ngay cả các thuật toán phức tạp cũng được song song hóa tốt trong Bend. Giao tiếp tầm xa được thực hiện thông qua global beta reduction (theo interaction calculus) và được đồng bộ chính xác, hiệu quả nhờ atomic linker của HVM2.
Tài liệu bổ sung
- Để bắt đầu ngay, hãy xem GUIDE.md của Bend.
- Để xem danh sách tính năng, hãy xem FEATURES.md.
- Để hiểu công nghệ của Bend, hãy xem bài báo về HVM2.
- Bend được phát triển tại HigherOrderCO.com - hãy tham gia Discord.
Ý kiến của GN⁺
- Đơn giản hóa lập trình song song: Bend đơn giản hóa rất nhiều việc lập trình song song, giúp ngay cả kỹ sư phần mềm mới vào nghề cũng có thể tiếp cận dễ dàng. Điều này làm giảm đáng kể rào cản gia nhập với lập trình song song.
- Hỗ trợ nhiều phần cứng: Bend có thể chạy hiệu quả không chỉ trên CPU mà còn trên GPU, nên có thể được tận dụng trong nhiều môi trường phần cứng khác nhau.
- Ngôn ngữ giàu khả năng biểu đạt: Kết hợp ưu điểm của Python và Haskell, cho phép viết mã giàu tính biểu đạt. Điều này giúp tăng tính dễ đọc và khả năng bảo trì của mã.
- Sinh mã vẫn ở giai đoạn đầu: Hiện việc sinh mã của Bend vẫn đang ở giai đoạn đầu, nên hiệu năng có thể kém hơn khi so với các trình biên dịch đã trưởng thành. Đây là điểm cần được cải thiện trong tương lai.
- Hỗ trợ nhiều hệ thống song song: Bend không bị giới hạn ở một mô hình cụ thể mà hỗ trợ nhiều hệ thống song song khác nhau, cho phép lập trình linh hoạt. Điều này giúp Bend có thể được ứng dụng trong nhiều lĩnh vực khác nhau.
1 bình luận
Ý kiến trên Hacker News
Tóm tắt các bình luận trên Hacker News
So sánh hiệu năng giữa Python và PyPy
Phản hồi tích cực
Ý kiến chỉ trích
Kỳ vọng về lập trình song song
So sánh hiệu năng
Kỳ vọng về sự phát triển của dự án
Góc nhìn hoài nghi
Triển vọng tích cực
Đặc tính ngôn ngữ của Bend