• CubeCL คือส่วนขยายภาษาหลายแพลตฟอร์มประสิทธิภาพสูงที่ช่วยให้เขียน GPU kernel ได้ใน Rust
  • รองรับ ฟังก์ชัน, generic, struct อย่างสมบูรณ์ และรองรับ trait, method, การอนุมานชนิดข้อมูล ได้บางส่วน
  • รองรับรันไทม์บน WGPU, CUDA, ROCm และกำลังพัฒนา JIT CPU runtime ที่ปรับแต่งประสิทธิภาพด้วย คำสั่ง SIMD
  • มีความสามารถ auto-vectorization, การเพิ่มประสิทธิภาพตอนคอมไพล์ (Comptime), autotune เพื่อดึงประสิทธิภาพของโค้ดออกมาให้สูงสุด
  • ใช้วิธีการที่เป็นเอกลักษณ์โดยอาศัย ระบบ procedural macro ของ Rust ในการพาร์สและขยายโค้ด GPU kernel

แนะนำ CubeCL

  • CubeCL เป็นส่วนขยายภาษาสำหรับการประมวลผลประสิทธิภาพสูงที่ขยายภาษา Rust เพื่อ รองรับการเขียน GPU kernel ได้โดยตรง
  • ใช้ zero-cost abstraction เพื่อให้สามารถพัฒนาเคอร์เนลที่ มีประสิทธิภาพและดูแลรักษาได้ง่าย
  • ปัจจุบัน รองรับฟังก์ชัน, generic, struct อย่างสมบูรณ์ และรองรับ trait, method, การอนุมานชนิดข้อมูลได้บางส่วน

ตัวอย่างการใช้งานแบบง่าย

  • ใช้แอตทริบิวต์ #[cube] เพื่อระบุฟังก์ชันที่จะรันบน GPU
  • ฟังก์ชัน gelu_array และ gelu_scalar ใช้คำสั่ง SIMD โดยอัตโนมัติเพื่อเพิ่มประสิทธิภาพ
  • สามารถใช้ฟังก์ชัน launch_unchecked เพื่อรันเคอร์เนลได้

รันไทม์ที่รองรับ

  • WGPU: รองรับ GPU ข้ามแพลตฟอร์มผ่าน Vulkan, Metal, DirectX, WebGPU
  • CUDA: รองรับการปรับแต่งสำหรับ NVIDIA GPU
  • ROCm/HIP: รองรับ AMD GPU (อยู่ระหว่างพัฒนา)
  • JIT CPU runtime: กำลังพัฒนา JIT CPU runtime ที่ปรับแต่งประสิทธิภาพโดยใช้คำสั่ง SIMD บนพื้นฐานของ Cranelift

เป้าหมายของ CubeCL

  • รองรับการเขียน เคอร์เนลสำหรับการประมวลผลประสิทธิภาพสูง โดยไม่ผูกติดกับฮาร์ดแวร์
  • ปรับปรุงความสามารถในการประกอบโค้ดกลับมาใช้ใหม่ การทดสอบ และการดูแลรักษา ผ่านความสามารถ auto-vectorization, comptime, auto-tuning
  • มอบการนำบัฟเฟอร์กลับมาใช้ซ้ำที่ปรับแต่งแล้วเพื่อให้ได้ throughput สูง ผ่าน กลยุทธ์การจัดการหน่วยความจำ
  • ตั้งเป้าพัฒนา องค์ประกอบเชิงพีชคณิตเชิงเส้น เพื่อสร้างระบบนิเวศสำหรับการประมวลผลประสิทธิภาพสูงและการคำนวณเชิงวิทยาศาสตร์

วิธีการทำงานของ CubeCL

  • ใช้วิธีการเฉพาะตัวโดยอาศัย ระบบ procedural macro ของ Rust เพื่อพาร์สและขยายโค้ด GPU kernel
  • Comptime: สามารถผสานการเพิ่มประสิทธิภาพตอนคอมไพล์ได้ง่าย โดยไม่แปลงซอร์สโค้ดต้นฉบับ
  • Auto-vectorization: ทำ vectorization กับอินพุตของฟังก์ชัน CubeCL เพื่อกำหนดองค์ประกอบการ vectorization ของตัวแปรกลางแต่ละตัว
  • การผสานกับ Rust: โค้ดที่สร้างขึ้นยังคงเป็น Rust ที่ถูกต้อง และสามารถแจกจ่ายเป็น bundle ได้โดยไม่ต้องพึ่งพารันไทม์เฉพาะตัวใดตัวหนึ่ง

การออกแบบและความสามารถพิเศษ

  • CubeCL ถูกออกแบบโดยมี cube เป็นแกนกลาง และ API สำหรับการประมวลผลทั้งหมดสามารถแมปกับฮาร์ดแวร์เพื่อใช้การแสดงผลแบบ 3D ได้
  • Auto-vectorization: สามารถเพิ่มประสิทธิภาพด้วยคำสั่ง SIMD และเข้าถึงองค์ประกอบของการ vectorization ได้โดยตรงภายในเคอร์เนล
  • Comptime: ปรับแก้ compiler IR ระหว่างรันไทม์เพื่อมอบทั้งการเพิ่มประสิทธิภาพและความยืดหยุ่น
  • Auto-tuning: รัน benchmark ขนาดเล็กในระหว่างรันไทม์เพื่อเลือกเคอร์เนลและการตั้งค่าที่เหมาะสมที่สุด

ข้อควรระวังและประวัติ

  • ปัจจุบัน CubeCL ยังอยู่ในสถานะ alpha version และยังมีบางส่วนที่ยังไม่สมบูรณ์
  • เดิมเริ่มต้นจากการเป็น WebGPU backend ของโปรเจกต์ Burn
  • จากนั้นได้ขยายไปเป็น IR แบบทั่วไปและ Rust frontend เมื่อเพิ่ม CUDA runtime
  • มีการพัฒนาแนวคิดแบบทั่วไปเพื่อข้ามความแตกต่างระหว่าง CUDA และ WebGPU

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น