- 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
ยังไม่มีความคิดเห็น