คู่มือการเขียนโปรแกรม CUDA
แหล่งข้อมูลทางการและครอบคลุมสำหรับนักพัฒนาที่ต้องการเรียนรู้โมเดลการเขียนโปรแกรม CUDA และวิธีเขียนโค้ดประสิทธิภาพสูงที่ทำงานบนหน่วยประมวลผลกราฟิกของ NVIDIA คู่มือนี้ครอบคลุมสถาปัตยกรรมแพลตฟอร์ม ชุดคำสั่งการเขียนโปรแกรม คุณสมบัติฮาร์ดแวร์ขั้นสูง และข้อมูลเทคนิคต่างๆ
บทเรียน
ภาพรวมคอร์สเรียน
📚 สรุปเนื้อหา
แหล่งข้อมูลทางการและครบถ้วนสำหรับนักพัฒนาที่ต้องการเรียนรู้โมเดลโปรแกรม CUDA และวิธีเขียนโค้ดประสิทธิภาพสูงที่ทำงานบนหน่วยประมวลผลกราฟิกของ NVIDIA คู่มือนี้ครอบคลุมสถาปัตยกรรมแพลตฟอร์ม หน้าที่การใช้งานของโปรแกรม การใช้คุณสมบัติฮาร์ดแวร์ขั้นสูง และรายละเอียดทางเทคนิค
เชี่ยวชาญศิลปะของการคำนวณแบบขนานด้วยคู่มือมาตรฐานในอุตสาหกรรมสำหรับ NVIDIA CUDA
ผู้เขียน: บริษัท NVIDIA Corporation
คำขอบคุณ: สิทธิ์การใช้งาน © 2007-2024 บริษัท NVIDIA Corporation และบริษัทในเครือ สงวนลิขสิทธิ์ทั้งหมด
🎯 เป้าหมายการเรียนรู้
- กำหนดบทบาทของโฮสต์ (โปรเซสเซอร์) และอุปกรณ์ (กราฟิกไพเพอร์) ภายในระบบไฮบริด
- อธิบายโมเดลโปรแกรมแบบ SIMT และโครงสร้างระดับชั้นของเธรด บล็อก และกริด
- แยกความแตกต่างระหว่างรหัส PTX (Parallel Thread Execution) และรหัสไบนารี (cubins) และอธิบายว่าการคอมไพล์แบบจุดเวลา (JIT) ช่วยให้เกิดความเข้ากันได้ได้อย่างไร
- พัฒนาและคอมไพล์เคอร์เนล CUDA: เขียนฟังก์ชัน global กำหนดการดำเนินการด้วยสัญลักษณ์สามชั้น และจัดการกระบวนการคอมไพล์โดยใช้ NVCC
- ปรับปรุงการจัดการหน่วยความจำและการเคลื่อนย้ายข้อมูล: แยกแยะโมเดลหน่วยความจำแบบรวม (Unified), แบบระบุชัด (Explicit), และแบบแมป (Mapped) และนำหน่วยความจำโฮสต์ที่ตรึงหน้า (page-locked) มาใช้เพื่อการส่งข้อมูลอย่างมีประสิทธิภาพ
- จัดการการดำเนินการแบบขนาน: ใช้สตรีม, อีเวนต์ และกลุ่มการทำงานร่วมกัน (Cooperative Groups) เพื่อจัดการงานแบบไม่ซิงโครนัส และทำให้การดำเนินการระหว่าง CPU กับ GPU ซิงโครนัสกันได้
- ดำเนินการคำนวณตัวชี้ที่ซับซ้อนและระบุจุดที่เป็นปัญหาในสถาปัตยกรรม (แบบ von Neumann ตรงกับแบบ Harvard)
- ใช้รูปแบบการดำเนินงานขั้นสูงของ CUDA เช่น การเรียกเคอร์เนลตามเงื่อนไขที่ควบคุมด้วยโปรแกรม และการถ่ายโอนข้อมูลแบบบัทช์ที่หลากหลาย
- ใช้คุณสมบัติเฉพาะฮาร์ดแวร์ เช่น ขอบเขตของเธรด (Thread Scopes), ตัวแทนแบบไม่ซิงโครนัส (Asynchronous Proxies), และพายเปล (Pipelines) เพื่อเพิ่มความสามารถในการทำงานพร้อมกันสูงสุด
- ตั้งค่าและปรับแต่งประสิทธิภาพของหน่วยความจำแบบรวม (Unified Memory) โดยใช้การดึงข้อมูลล่วงหน้า (prefetching), คำแนะนำการใช้งาน (usage hints), และการจัดการขนาดหน้า (page size management)
🔹 บทเรียนที่ 1: ความรู้พื้นฐานของ CUDA และภาพรวมสถาปัตยกรรม
ภาพรวม: บทเรียนนี้แนะนำแพลตฟอร์มการคำนวณแบบขนานของ CUDA และสถาปัตยกรรมฮาร์ดแวร์พื้นฐาน สำรวจวิธีที่ระบบไฮบริดใช้ทั้งโปรเซสเซอร์และกราฟิกไพเพอร์ โมเดลโปรแกรมแบบ SIMT (Single Instruction, Multiple Threads) และโครงสร้างระดับชั้นของเธรด บล็อก และกริด นอกจากนี้ยังครอบคลุมกระบวนการคอมไพล์ของ CUDA รวมถึงบทบาทของ PTX cubins และ fatbins ในการรับประกันความเข้ากันได้ทั้งในด้านไบนารีและอนาคต
ผลลัพธ์จากการเรียนรู้:
- กำหนดบทบาทของโฮสต์ (โปรเซสเซอร์) และอุปกรณ์ (กราฟิกไพเพอร์) ภายในระบบไฮบริด
- อธิบายโมเดลโปรแกรมแบบ SIMT และโครงสร้างระดับชั้นของเธรด บล็อก และกริด
- แยกความแตกต่างระหว่างรหัส PTX (Parallel Thread Execution) และรหัสไบนารี (cubins) และอธิบายว่าการคอมไพล์แบบจุดเวลา (JIT) ช่วยให้เกิดความเข้ากันได้ได้อย่างไร
🔹 บทเรียนที่ 2: การเขียนโปรแกรมหลักของ GPU และการจัดการการดำเนินงาน
ภาพรวม: บทเรียนนี้ครอบคลุมด้านพื้นฐานและขั้นสูงของการเขียนโปรแกรมบน GPU โดยใช้ CUDA C++ ตั้งแต่การกำหนดเคอร์เนลเบื้องต้นและกระบวนการคอมไพล์ด้วย NVCC ไปจนถึงหัวข้อการจัดการการดำเนินงานขั้นสูง ได้แก่ การออกแบบเคอร์เนลแบบ SIMT ข้อจำกัดจากการเข้าถึงแบงก์หน่วยความจำแบบแชร์ (shared memory bank conflicts) และการดำเนินงานแบบไม่ซิงโครนัสโดยใช้สตรีมและอีเวนต์ นักเรียนจะเรียนรู้วิธีบาลานซ์โมเดลหน่วยความจำ (แบบรวมกับแบบระบุชัด) และเพิ่มประสิทธิภาพการใช้งานฮาร์ดแวร์เพื่อการคำนวณประสิทธิภาพสูง
ผลลัพธ์จากการเรียนรู้:
- พัฒนาและคอมไพล์เคอร์เนล CUDA: เขียนฟังก์ชัน global กำหนดการดำเนินการด้วยสัญลักษณ์สามชั้น และจัดการกระบวนการคอมไพล์โดยใช้ NVCC
- ปรับปรุงการจัดการหน่วยความจำและการเคลื่อนย้ายข้อมูล: แยกแยะโมเดลหน่วยความจำแบบรวม (Unified), แบบระบุชัด (Explicit), และแบบแมป (Mapped) และนำหน่วยความจำโฮสต์ที่ตรึงหน้า (page-locked) มาใช้เพื่อการส่งข้อมูลอย่างมีประสิทธิภาพ
- จัดการการดำเนินการแบบขนาน: ใช้สตรีม, อีเวนต์ และกลุ่มการทำงานร่วมกัน (Cooperative Groups) เพื่อจัดการงานแบบไม่ซิงโครนัส และทำให้การดำเนินการระหว่าง CPU กับ GPU ซิงโครนัสกันได้
🔹 บทเรียนที่ 3: ตรรกะหน่วยความจำขั้นสูงและระบบหลายหน่วยประมวลผลกราฟิก
ภาพรวม: บทเรียนนี้สำรวจการเปลี่ยนผ่านจากสถาปัตยกรรมหน่วยความจำพื้นฐานและตรรกะตัวชี้ไปสู่เทคนิคการเร่งความเร็วของ GPU ขั้นสูง ครอบคลุมโมเดลการดำเนินงานระดับฮาร์ดแวร์ (SIMT, Independent Thread Scheduling) กลไกการซิงโครนัสที่ซับซ้อน (อีเวนต์หยุดแบบไม่ซิงโครนัส, อะตอมิกแบบจำกัดขอบเขต) และการประสานงานระบบหลายหน่วยประมวลผลกราฟิกโดยใช้ทั้ง API แบบเรนไทม์และไดรเวอร์
ผลลัพธ์จากการเรียนรู้:
- ดำเนินการคำนวณตัวชี้ที่ซับซ้อนและระบุจุดที่เป็นปัญหาในสถาปัตยกรรม (แบบ von Neumann ตรงกับแบบ Harvard)
- ใช้รูปแบบการดำเนินงานขั้นสูงของ CUDA เช่น การเรียกเคอร์เนลตามเงื่อนไขที่ควบคุมด้วยโปรแกรม และการถ่ายโอนข้อมูลแบบบัทช์ที่หลากหลาย
- ใช้คุณสมบัติเฉพาะฮาร์ดแวร์ เช่น ขอบเขตของเธรด (Thread Scopes), ตัวแทนแบบไม่ซิงโครนัส (Asynchronous Proxies), และพายเปล (Pipelines) เพื่อเพิ่มความสามารถในการทำงานพร้อมกันสูงสุด
🔹 บทเรียนที่ 4: การปรับปรุงประสิทธิภาพ กราฟ และเครื่องเร่งฮาร์ดแวร์
ภาพรวม: บทเรียนนี้ครอบคลุมเทคนิคการเขียนโปรแกรม CUDA ประสิทธิภาพสูง โดยเน้นการปรับปรุงการเคลื่อนย้ายข้อมูลและการไหลของคำสั่ง สำรวจการเปลี่ยนแปลงจากแบบการดำเนินงานแบบสตรีมไปสู่ CUDA Graphs แบบคงที่ การควบคุมละเอียดของหน่วยความจำแบบรวมผ่านการดึงข้อมูลล่วงหน้าและคำแนะนำ รวมถึงการใช้เครื่องเร่งฮาร์ดแวร์เฉพาะ เช่น ตัวเร่งหน่วยความจำเทนเซอร์ (Tensor Memory Accelerator - TMA) และการคงอยู่ของแคชระดับ 2 (L2 Cache persistence) นอกจากนี้ยังอธิบายรูปแบบการซิงโครนัสขั้นสูง การแบ่งทรัพยากรผ่าน Green Contexts และการใช้งานข้ามไลบรารี (cross-API interoperability) สำหรับการคำนวณแบบไฮบริดสมัยใหม่
ผลลัพธ์จากการเรียนรู้:
- ตั้งค่าและปรับแต่งประสิทธิภาพของหน่วยความจำแบบรวม (Unified Memory) โดยใช้การดึงข้อมูลล่วงหน้า (prefetching), คำแนะนำการใช้งาน (usage hints), และการจัดการขนาดหน้า (page size management)
- สร้าง ปรับปรุง และดำเนินการ CUDA Graphs รวมถึงการใช้เมมโมรีน็อดและคำสั่งเริ่มต้นที่อุปกรณ์
- ใช้การซิงโครนัสขั้นสูงโดยใช้อีเวนต์หยุดแบบไม่ซิงโครนัสและรูปแบบผู้ผลิต-ผู้บริโภค (Producer-Consumer pattern)
🔹 บทเรียนที่ 5: ข้อมูลอ้างอิงทางเทคนิคและขยายภาษา
ภาพรวม: บทเรียนนี้นำเสนอการลงลึกเชิงเทคนิคเกี่ยวกับข้อมูลอ้างอิงของโมเดลโปรแกรม CUDA และการขยายภาษา C++ ครอบคลุมการติดต่อระหว่างซอฟต์แวร์และฮาร์ดแวร์ผ่านความสามารถในการคำนวณ (compute capabilities) ตัวแปรสภาพแวดล้อมสำหรับการควบคุมเวลาทำงาน และข้อกำหนดเฉพาะด้านไวยากรณ์สำหรับการเขียนโค้ดอุปกรณ์ประสิทธิภาพสูงโดยใช้มาตรฐาน C++ สมัยใหม่ กลุ่มการทำงานร่วมกัน และอินทรินซีกของฮาร์ดแวร์เฉพาะ
ผลลัพธ์จากการเรียนรู้:
- ระบุข้อจำกัดของฮาร์ดแวร์และชุดคุณสมบัติที่มีอยู่ตามรุ่นของความสามารถในการคำนวณ (GPU Compute Capability)
- ตั้งค่าสภาพแวดล้อมการดำเนินงานของ CUDA และการคอมไพล์แบบจุดเวลา (JIT) โดยใช้ตัวแปรสภาพแวดล้อมระดับระบบ
- ใช้การขยายภาษา C++ (Annotations, lambdas, templates) โดยปฏิบัติตามข้อจำกัดด้านอุปกรณ์