5 คะแนน โดย GN⁺ 2023-10-22 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ความเข้าใจพื้นฐานเกี่ยวกับ 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

  1. คัดลอกข้อมูลจากโฮสต์ไปยังดีไวซ์
  2. จัดตาราง thread block ไปยัง SM
  3. Single Instruction Multiple Thread (SIMT) และ warp
  4. การจัดตาราง warp และการซ่อน latency
  5. คัดลอกข้อมูลผลลัพธ์จากดีไวซ์ไปยังหน่วยความจำของโฮสต์

# แนวคิดเรื่องการแบ่งทรัพยากรและ 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 ความคิดเห็น

 
GN⁺ 2023-10-22
ความคิดเห็นบน Hacker News
  • บทความนี้ถูกวิจารณ์ว่าเน้นเฉพาะ Nvidia มากเกินไป และมองข้ามทางเลือกที่ใช้ได้จริงอื่น ๆ เช่น Sycl, Sapphire Rapids และ MI300 ของ AMD
  • มีข้อสังเกตว่าบทความกล่าวถึง asynchronous copy ไม่เพียงพอ ซึ่งช่วยป้องกันไม่ให้ GPU ว่างงานระหว่างการถ่ายโอนข้อมูล
  • บทความนี้ได้รับคำชมว่าเป็นบทนำที่ดีเกี่ยวกับการเขียนโปรแกรม GPU แต่ก็มีข้อเสนอแนะว่าควรสำรวจเทคนิคขั้นสูงเพิ่มเติม
  • ผู้อ่านบางคนตั้งข้อสงสัยต่อความถูกต้องของข้ออ้างในบทความที่ว่ากฎของ Little ในทฤษฎีคิวสามารถนำมาประยุกต์ใช้กับ GPU ได้
  • คำอธิบายเรื่องสถาปัตยกรรมหน่วยความจำในบทความถูกวิจารณ์ว่าไม่ได้กล่าวถึงประเด็นที่ว่าแคชไม่ได้รับประกันความสอดคล้องกันระหว่างเธรด
  • มีข้อเสนอให้เปลี่ยนชื่อ GPU เป็น PPU (Parallel Processing Units) เพื่อให้สะท้อนความสามารถของมันได้ดียิ่งขึ้น
  • บทความนี้ได้รับคำชมว่าเป็นหนึ่งในคำอธิบายเรื่องการเขียนโปรแกรม GPU ที่ดีที่สุด และได้รับการแนะนำให้นำไปใช้ในการให้คำปรึกษาหรือเมนเทอร์
  • การเขียนโปรแกรมแบบ SIMD ถูกบรรยายว่า "ดิบเถื่อน" โดยสามารถคำนวณแบบง่ายสำหรับทุกพิกเซลได้ แต่มีความยากเมื่อมีเงื่อนไขแตกแขนง
  • มีการตั้งคำถามเกี่ยวกับประสิทธิภาพของการใช้ GPU สำหรับงานคำนวณอาร์เรย์บางประเภท โดยคำนึงถึงความจำเป็นในการส่งข้อมูลไปยัง GPU และดึงข้อมูลกลับจาก GPU