- ความเข้าใจพื้นฐานเกี่ยวกับ GPU Computing เป็นสิ่งจำเป็นสำหรับวิศวกรซอฟต์แวร์ทุกคน
- บทความนี้เน้นไปที่ Nvidia GPU เป็นหลัก และใช้คำศัพท์ของ Nvidia
- GPU ถูกออกแบบมาสำหรับการประมวลผลแบบขนานขนาดใหญ่และ throughput สูงในงานกราฟิก การคำนวณเชิงตัวเลข และดีปเลิร์นนิง
เปรียบเทียบ CPU และ GPU
- CPU ถูกออกแบบมาสำหรับการรันคำสั่งแบบลำดับต่อเนื่อง และมีฟีเจอร์ต่าง ๆ เพื่อช่วยลด latency ของการรันคำสั่ง
- GPU ถูกออกแบบมาสำหรับการประมวลผลแบบขนานขนาดใหญ่และ throughput สูง และมี latency ของการรันคำสั่งในระดับปานกลางถึงสูง
- GPU สามารถประมวลผลการคำนวณจำนวนมากได้เร็วกว่ามากเมื่อเทียบกับ CPU
# สถาปัตยกรรม GPU
สถาปัตยกรรมการประมวลผลของ GPU
- GPU ประกอบด้วยชุดของ Streaming Multiprocessor (SM)
- แต่ละ SM มี Streaming Processor หลายตัว (คอร์หรือเธรด)
- SM มีหน่วยความจำบนชิปในปริมาณจำกัด (shared memory หรือ scratchpad) ซึ่งคอร์ทั้งหมดใช้ร่วมกัน
สถาปัตยกรรมหน่วยความจำของ GPU
- GPU มีหน่วยความจำหลายประเภทในหลายลำดับชั้น
- แต่ละ SM มีรีจิสเตอร์จำนวนมาก ซึ่งใช้ร่วมกันระหว่างคอร์
- constant cache ใช้สำหรับแคชข้อมูลค่าคงที่ที่ใช้ระหว่างการรันโค้ด
- shared memory คือหน่วยความจำ SRAM บนชิปที่ตั้งโปรแกรมได้ ซึ่งเร็วและมี latency ต่ำ
- L1 cache ใช้แคชข้อมูลที่มีการเข้าถึงบ่อยจาก L2 cache
- L2 cache ถูกใช้ร่วมกันโดยทุก SM และใช้แคชข้อมูลที่มีการเข้าถึงบ่อยจาก global memory
- global memory คือ DRAM ที่มีความจุสูงและแบนด์วิดท์สูง แต่มี latency สูงเพราะอยู่ไกลจาก SM
# ทำความเข้าใจโมเดลการทำงานของ GPU
แนะนำสั้น ๆ เกี่ยวกับ CUDA kernel และ thread block
- CUDA คืออินเทอร์เฟซการเขียนโปรแกรมสำหรับการเขียนโปรแกรมให้กับ Nvidia GPU
- kernel คือการคำนวณที่แสดงในรูปแบบคล้ายฟังก์ชัน C/C++ ซึ่งรันแบบขนานบน GPU
- สำหรับการรัน kernel จะมีการเริ่มต้นชุดของเธรดที่เรียกว่า grid
ขั้นตอนของการรัน kernel บน GPU
- คัดลอกข้อมูลจากโฮสต์ไปยังดีไวซ์
- จัดตาราง thread block ไปยัง SM
- Single Instruction Multiple Thread (SIMT) และ warp
- การจัดตาราง warp และการซ่อน latency
- คัดลอกข้อมูลผลลัพธ์จากดีไวซ์ไปยังหน่วยความจำของโฮสต์
# แนวคิดเรื่องการแบ่งทรัพยากรและ occupancy
- การใช้ทรัพยากรของ GPU วัดด้วยตัวชี้วัดที่เรียกว่า "occupancy" ซึ่งแสดงอัตราส่วนระหว่างจำนวน warp ที่ถูกจัดสรรกับจำนวน warp สูงสุดที่ SM รองรับได้
- occupancy ถูกจำกัดโดยทรัพยากรสำหรับการรันของ SM, รีจิสเตอร์, shared memory, สล็อตของ thread block และสล็อตของเธรด
- การลด latency ให้ต่ำลงพร้อมรักษา occupancy ให้สูงผ่านการปรับแต่งโค้ดเป็นสิ่งสำคัญ
# สรุป
- GPU ประกอบด้วย SM หลายตัว และแต่ละ SM มีคอร์ประมวลผลหลายคอร์
- global memory อยู่ไกลจากชิปและมี latency สูง
- L1 และ L2 cache ทำงานคล้ายกับ L1/L2 cache ของ CPU
- แต่ละ SM มี shared memory ซึ่งใช้ร่วมกันระหว่างคอร์
- ในการรัน kernel บน GPU จะมีการเริ่มต้น grid ของเธรด
- GPU จะจัดสรร block สำหรับรันบน SM และทุกเธรดจะรันอยู่บน SM เดียวกัน
- เธรดที่ถูกจัดสรรให้กับ SM จะถูกจัดกลุ่มเพิ่มเติมเป็นหน่วยขนาด 32 ที่เรียกว่า warp
- GPU ทำการแบ่งทรัพยากรแบบไดนามิกระหว่างเธรดตามความต้องการของเธรดและข้อจำกัดของ SM
# ปิดท้าย
- ปัจจุบัน GPU ถูกใช้งานอย่างแพร่หลาย และสถาปัตยกรรมกับโมเดลการทำงานของมันแตกต่างจาก CPU อย่างมีนัยสำคัญ
- บทความนี้ครอบคลุมหลายแง่มุมของ GPU และให้มุมมองว่าเหตุใด GPU จึงถูกใช้อย่างแพร่หลายและทำงานอย่างไร
ความเห็นของ GN⁺
- GPU เป็นเทคโนโลยีสำคัญสำหรับดีปเลิร์นนิงและการคำนวณเชิงตัวเลขที่ซับซ้อน และบทความนี้ช่วยให้เข้าใจสถาปัตยกรรมพื้นฐานและโมเดลการทำงานของ GPU ได้ดีขึ้น
- เนื้อหานี้สำคัญเป็นพิเศษสำหรับวิศวกรซอฟต์แวร์ระดับเริ่มต้นที่สนใจการประมวลผลแบบขนานและการประมวลผลสมรรถนะสูง
- บทความนี้มอบความรู้พื้นฐานเกี่ยวกับการเขียนโปรแกรม GPU และเป็นเนื้อหาที่น่าสนใจซึ่งช่วยกระตุ้นความอยากรู้อยากเห็นต่อสาขานี้
1 ความคิดเห็น
ความคิดเห็นบน Hacker News