1 คะแนน โดย GN⁺ 2024-05-18 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 2024-05-18
ความเห็นจาก Hacker News

สรุปความคิดเห็นจาก Hacker News

  • เปรียบเทียบประสิทธิภาพ Python กับ PyPy

    • เมื่อรันโค้ดเดียวกันด้วย Python และ PyPy, PyPy เร็วกว่ามาก
    • มีการแชร์ผลเบนช์มาร์กบน Apple M3 Max และ NVIDIA RTX 4090
    • ประสิทธิภาพบน Intel i7-1270P ช้ามาก
    • ควรมีการทดสอบบนแพลตฟอร์มอื่นนอกเหนือจาก Mac ด้วย
  • ฟีดแบ็กเชิงบวก

    • เมื่อพิจารณาว่าโครงการยังอยู่ในช่วงเริ่มต้น ก็มีการชื่นชมผลงานนี้
    • เมื่อเทียบกับ Futhark ก็น่าเสียดายที่ยังไม่รองรับ target ที่หลากหลาย
    • ปัญหาด้านประสิทธิภาพดูเหมือนจะแก้ไขได้
  • ความคิดเห็นเชิงวิจารณ์

    • แม้จะเป็นเวอร์ชันเริ่มต้นก็ยังได้รับคำวิจารณ์มาก
    • หน้าเว็บใช้งานตรงไปตรงมาและเข้าใจง่าย
    • มีการพูดถึงช่องว่างระหว่างความคาดหวังกับความเป็นจริงของอัลกอริทึมแบบขนาน
  • ความคาดหวังต่อการเขียนโปรแกรมแบบขนาน

    • มีการแสดงความคาดหวังต่ออนาคตของการเขียนโปรแกรมแบบขนาน
    • มีการแชร์ประสบการณ์ทดลองเขียนโปรแกรมแบบขนานผ่าน Rust และ Shadertoy
    • มีความคาดหวังต่อภาษาทั่วไปสำหรับการประมวลผลแบบขนานที่ใช้ GPU
  • การเปรียบเทียบประสิทธิภาพ

    • ลูปแบบง่ายที่เขียนด้วย C++ ให้ประสิทธิภาพใกล้เคียงกับ Bend
    • โค้ด C++ ที่ปรับแต่งแล้วเร็วกว่ามาก
  • ความคาดหวังต่อพัฒนาการของโครงการ

    • มีการชื่นชมที่สามารถก้าวข้ามความยากของการทำ parallelization แบบอัตโนมัติได้
    • คาดหวังว่าโครงการจะพัฒนาไปได้อีก
  • มุมมองแบบตั้งข้อสงสัย

    • มีการชี้ว่า Bend มีลักษณะเป็น DSL ที่มีข้อจำกัด
    • เน้นว่าประสิทธิภาพยังไม่ดี
    • กล่าวถึงว่าในงานคอมพิวติ้งแบบขนานสมรรถนะสูงจริง ๆ อาร์เรย์เป็นสิ่งสำคัญ
    • ยังสงสัยในความมีประโยชน์ของ Bend
  • มุมมองเชิงบวก

    • กล่าวถึงความเป็นไปได้ที่ Bend จะดึงการใช้งาน GPU ได้สูงสุด
    • คาดหวังถึงความเป็นไปได้หลากหลายของการใช้ GPU นอกเหนือจาก LLMs
  • ลักษณะทางภาษาของ Bend

    • ชื่นชมการใช้งานที่เรียบง่ายและการเพิ่มขึ้นของประสิทธิภาพของ Bend
    • น่าเสียดายที่รองรับเพียงจำนวนเต็ม 24 บิต
    • มีการกล่าวว่าจำเป็นต้องรองรับจำนวนเต็มที่มีบิตสูงกว่านี้