Bend - ภาษาระดับสูงที่รันบน GPU (ใช้ HVM2)
(github.com/HigherOrderCO)- Bend เป็นภาษาการเขียนโปรแกรมระดับสูงที่รองรับการประมวลผลแบบขนานขนาดใหญ่
- ต่างจากทางเลือกแบบระดับต่ำอย่าง CUDA และ Metal, Bend มอบความรู้สึกและความสามารถของภาษาที่มีพลังในการแสดงออกอย่าง Python และ Haskell
- มีการจัดสรรอ็อบเจ็กต์ที่รวดเร็ว, ฟังก์ชันลำดับสูงพร้อมการรองรับ closure อย่างสมบูรณ์, recursion ที่ไม่จำกัด, และแม้กระทั่ง continuations
- แต่สามารถรันบนฮาร์ดแวร์แบบขนานขนาดใหญ่ เช่น GPU และแสดงการเพิ่มความเร็วที่เกือบเป็นเชิงเส้นตามจำนวนคอร์
- ไม่ต้องมีคำอธิบายประกอบเพื่อระบุความขนานเลย: ไม่ต้องสร้างเธรด, ไม่ต้องใช้ lock, mutex หรือ atomic operation
- Bend ทำงานโดยขับเคลื่อนผ่านรันไทม์ HVM2
เดโมแบบรวดเร็ว
การใช้งาน Bend
ตอนนี้ยังใช้งานบน Windows ไม่ได้ ต้องใช้ WSL2 แทน
- ก่อนอื่น ต้องติดตั้ง Rust nightly
- จากนั้นติดตั้ง HVM2 และ Bend:
cargo +nightly install hvm cargo +nightly install bend-lang - สุดท้าย เขียนไฟล์ Bend แล้วรันด้วยคำสั่งใดคำสั่งหนึ่งต่อไปนี้:
bend run # ใช้ Rust interpreter (ทำงานแบบลำดับ) bend run-c # ใช้ C interpreter (ทำงานแบบขนาน) bend run-cu # ใช้ CUDA interpreter (ขนานขนาดใหญ่) - นอกจากนี้ ยังสามารถใช้
gen-cและgen-cuเพื่อคอมไพล์ Bend เป็นไฟล์ C/CUDA แบบสแตนด์อโลนเพื่อประสิทธิภาพสูงสุดได้ อย่างไรก็ตาม การสร้างโค้ดยังอยู่ในช่วงเริ่มต้น และยังไม่สุกงอมเท่าคอมไพเลอร์ล้ำสมัยอย่าง GCC หรือ GHC
การเขียนโปรแกรมแบบขนานใน Bend
- ถ้าต้องการเขียนโปรแกรมแบบขนานใน Bend... ไม่ต้องทำอะไรเลย ตราบใดที่เขียนให้ ไม่ได้เป็นงานแบบลำดับโดยเนื้อแท้
- ตัวอย่างเช่น นิพจน์ต่อไปนี้ไม่สามารถรันแบบขนานได้:
เพราะ(((1 + 2) + 3) + 4)+4ขึ้นอยู่กับ+3และ+3ก็ขึ้นอยู่กับ(1+2) - แต่นิพจน์ต่อไปนี้สามารถรันแบบขนานได้:
เพราะ((1 + 2) + (3 + 4))(1+2)และ(3+4)เป็นอิสระจากกัน ตามหลักการพื้นฐานของ Bend คือ ทุกสิ่งที่สามารถรันแบบขนานได้ จะถูกรันแบบขนาน
โค้ดตัวอย่าง
-
สำหรับตัวอย่างที่สมบูรณ์มากขึ้น ลองพิจารณาโค้ดต่อไปนี้:
# 정렬 네트워크 = 트리 회전 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) # 서브 트리 회전 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)) -
ไฟล์นี้เป็นการติดตั้ง bitonic sorter โดยใช้ การหมุนต้นไม้แบบไม่เปลี่ยนแปลงค่า ซึ่งไม่ใช่อัลกอริทึมที่คาดว่าจะรันได้เร็วบน GPU แต่เพราะใช้งานแนวทางแบ่งแยกแล้วพิชิต จึง มีความขนานโดยธรรมชาติ Bend จึงรันมันแบบหลายเธรดได้ ต่อไปนี้คือ benchmark บางส่วน:
- CPU, Apple M3 Max, 1 เธรด: 12.15 วินาที
- CPU, Apple M3 Max, 16 เธรด: 0.96 วินาที
- GPU, NVIDIA RTX 4090, 16k เธรด: 0.21 วินาที
- ได้รับ ความเร็วเพิ่มขึ้น 57 เท่า โดยไม่ต้องทำอะไรเลย ไม่มีการจัดการเธรด, lock หรือ mutex แบบระบุชัดเจน แค่สั่งให้ Bend รันโปรแกรมบน RTX เท่านั้น
รองรับระบบขนานหลากหลายรูปแบบ
-
Bend ไม่ได้จำกัดอยู่กับกระบวนทัศน์เฉพาะอย่างเทนเซอร์หรือเมทริกซ์ สามารถจำลองระบบขนานได้ทุกแบบใน Bend ตั้งแต่ shader ไปจนถึง actor model แบบ Erlang
-
ตัวอย่างเช่น หากต้องการเรนเดอร์ภาพแบบเรียลไทม์ ก็สามารถจัดสรรต้นไม้แบบไม่เปลี่ยนแปลงค่าสำหรับแต่ละเฟรมได้:
# เมื่อให้ shader มา จะคืนค่าภาพสี่เหลี่ยม 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 # เมื่อให้ตำแหน่งมา จะคืนค่าสี # ในเดโมนี้จะเพียงแค่วนลูปแบบยุ่งตลอดเวลา def demo_shader(x, y): bend i = 0: when i < 5000: color = fork(i + 1) else: color = 0x000001 return color # เรนเดอร์ภาพขนาด 256x256 โดยใช้ demo_shader def main: return render(16, demo_shader) -
ใช้งานได้จริง และแม้อัลกอริทึมที่ซับซ้อนก็ยังขนานได้ดีใน Bend การสื่อสารระยะไกลทำผ่าน global beta reduction (ตาม interaction calculus) และซิงโครไนซ์ได้อย่างถูกต้องและมีประสิทธิภาพด้วย atomic linker ของ HVM2
แหล่งข้อมูลเพิ่มเติม
- หากต้องการเริ่มทันที ให้ดู GUIDE.md ของ Bend
- หากต้องการดูรายการฟีเจอร์ ให้ดู FEATURES.md
- หากต้องการเข้าใจเทคโนโลยีของ Bend ให้ดูงานวิจัยของ HVM2
- Bend พัฒนาโดย HigherOrderCO.com - เข้าร่วม Discord ได้
ความเห็นของ GN⁺
- การทำให้การเขียนโปรแกรมแบบขนานง่ายขึ้น: Bend ทำให้การเขียนโปรแกรมแบบขนานง่ายมาก แม้วิศวกรซอฟต์แวร์ระดับเริ่มต้นก็เข้าถึงได้ง่าย ช่วยลดกำแพงในการเริ่มต้นกับการเขียนโปรแกรมแบบขนานลงอย่างมาก
- รองรับฮาร์ดแวร์หลากหลาย: Bend สามารถทำงานได้อย่างมีประสิทธิภาพทั้งบน CPU และ GPU จึงนำไปใช้ได้ในสภาพแวดล้อมฮาร์ดแวร์ที่หลากหลาย
- ภาษาที่มีพลังในการแสดงออก: ด้วยการผสานข้อดีของ Python และ Haskell จึงสามารถเขียนโค้ดที่แสดงออกได้ดี ช่วยเพิ่มความอ่านง่ายและการดูแลรักษาโค้ด
- การสร้างโค้ดยังอยู่ในช่วงเริ่มต้น: ปัจจุบันการสร้างโค้ดของ Bend ยังอยู่ในช่วงเริ่มต้น จึงอาจมีประสิทธิภาพด้อยกว่าคอมไพเลอร์ที่สุกงอมแล้ว และยังต้องได้รับการปรับปรุงต่อไปในอนาคต
- รองรับระบบขนานที่หลากหลาย: Bend ไม่ได้จำกัดอยู่กับกระบวนทัศน์ใดกระบวนทัศน์หนึ่ง และรองรับระบบขนานได้หลากหลาย ทำให้เขียนโปรแกรมได้อย่างยืดหยุ่นและนำไปใช้ได้ในหลายด้าน
1 ความคิดเห็น
ความเห็นจาก Hacker News
สรุปความคิดเห็นจาก Hacker News
เปรียบเทียบประสิทธิภาพ Python กับ PyPy
ฟีดแบ็กเชิงบวก
ความคิดเห็นเชิงวิจารณ์
ความคาดหวังต่อการเขียนโปรแกรมแบบขนาน
การเปรียบเทียบประสิทธิภาพ
ความคาดหวังต่อพัฒนาการของโครงการ
มุมมองแบบตั้งข้อสงสัย
มุมมองเชิงบวก
ลักษณะทางภาษาของ Bend