1 คะแนน โดย GN⁺ 2023-12-19 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • AMD CDNA 3 เป็นสถาปัตยกรรม GPU สำหรับงานคอมพิวต์ที่มุ่งแก้จุดอ่อนของ CDNA 2 ซึ่งแม้ทำผลงานได้ดีในงานซูเปอร์คอมพิวติ้ง FP64 แต่ยังเป็นรอง H100 ในด้านประสิทธิภาพ AI และขนาดของ GPU แบบรวมศูนย์
  • MI300X เปิดให้เห็น 304 Compute Unit รวมจาก XCD 8 ตัวเป็นเหมือน GPU เดียว ช่วยลดภาระที่แบบ MI250X เคยมีซึ่งต้องกระจายงานระหว่าง GPU สองตัวและพูลหน่วยความจำแยกกัน
  • ลำดับชั้นหน่วยความจำถูกปรับใหม่เป็น Infinity Cache ขนาด 256MB, L2 ขนาด 4MB ต่อ XCD และ L1 ขนาด 32KB ใกล้กับ CU โดยในทางทฤษฎีให้แบนด์วิดท์แคช 17.2TB/s แต่ในโครงสร้างหน่วยความจำแบบรวม ลิงก์ die-to-die อาจกลายเป็นคอขวดได้
  • หน่วยประมวลผลเพิ่มการใช้ FP32 ด้วยโครงสร้างที่ใกล้เคียงกับ dual issue และเพิ่มจำนวนเธรดที่ติดตามได้ต่อ SIMD ขณะเดียวกัน throughput ของงานเมทริกซ์ก็เพิ่มเป็น 2 เท่าต่อ CU เมื่อเทียบกับ CDNA รุ่นก่อน
  • การเปลี่ยนแปลงหลักของ CDNA 3 อยู่ที่ลำดับชั้นหน่วยความจำและการแพ็กเกจ โดย MI300X ถูกออกแบบให้แบนด์วิดท์ Infinity Fabric ที่เพิ่มขึ้นมากทำให้ชิปเล็ตหลายตัวดูเหมือนแอกเซเลอเรเตอร์ขนาดใหญ่เพียงตัวเดียว

ช่องว่างที่ CDNA 3 ตั้งเป้าจะอุด

  • AMD พัฒนาสถาปัตยกรรมมาอย่างต่อเนื่องผ่าน Terascale 3, GCN และการแยก CDNA/RDNA เพื่อไล่ตาม Nvidia ในตลาด GPU สำหรับงานคอมพิวต์
  • MI250X และ MI210 ที่ใช้ CDNA 2 คว้าสัญญาซูเปอร์คอมพิวเตอร์หลายโครงการ รวมถึง Frontier ของ ORNL และ Frontier ก็ครองอันดับ 1 TOP500 ในเดือนพฤศจิกายน 2023
  • CDNA 2 ให้ประสิทธิภาพ FP64 ที่แข็งแกร่งและคุ้มต้นทุน แต่ H100 มีประสิทธิภาพ AI ดีกว่าและให้ GPU แบบรวมศูนย์ ที่ใหญ่กว่า
  • CDNA 3 จึงถูกออกแบบมาเพื่อลดช่องว่างนี้ โดยผสานเทคโนโลยีแพ็กเกจขั้นสูงของ AMD, Infinity Fabric, Infinity Cache จากสาย RDNA และ Compute Unit ที่ได้รับการปรับปรุง

เลย์เอาต์ GPU ของ MI300X

  • MI300X ใช้โครงสร้างชิปเล็ตที่แยกส่วนคอมพิวต์ออกเป็น Accelerator Complex Die(XCD)
    • XCD มีบทบาทคล้ายกับ Graphics Compute Die(GCD) ของ CDNA 2/RDNA 3 และ Core Complex Die(CCD) ของ Ryzen
    • เนื่องจากผลิตภัณฑ์ CDNA ไม่มีฮาร์ดแวร์กราฟิกเฉพาะแบบสาย RDNA จึงดูเหมือนว่า AMD จะเปลี่ยนชื่อเรียก
  • XCD แต่ละตัวมี CDNA 3 Compute Unit อยู่จริง 40 หน่วย และใน MI300X เปิดใช้งาน 38 หน่วยต่อ XCD
    • XCD หนึ่งตัวมี L2 cache ขนาด 4MB และ CU ทั้งหมดบนไดนั้นใช้ร่วมกัน
    • MI300X มี XCD 8 ตัว รวมเป็น 304 Compute Unit
  • จำนวนนี้เพิ่มขึ้นมากจาก 220 CU ของ MI250X และ MI300X ยังเปิดเผย CU เหล่านี้เป็น GPU เดียว ได้
    • ใน MI250X แต่ละ GPU มีพูลหน่วยความจำแยกของตัวเอง ทำให้โปรแกรมเมอร์ต้องแบ่งงานลงสอง GPU ด้วยตนเอง
  • Nvidia H100 เปิดเผย Streaming Multiprocessor(SM) 132 หน่วยเป็น GPU แบบรวมศูนย์ตัวเดียว แต่ยังใช้แนวทางดั้งเดิมที่สร้างส่วนคอมพิวต์ไว้บนไดเดี่ยวขนาดใหญ่
    • H100 แบ่ง L2 ออกเป็นสองอินสแตนซ์ โดย SM เดี่ยวสามารถใช้ L2 ทั้ง 50MB ได้ แต่การเข้าถึงเกิน 25MB จะมีโทษด้านประสิทธิภาพ
    • XCD ของ MI300X ไม่ได้นำความจุ L2 ของ XCD อื่นมาใช้เป็นแคช ดังนั้นในแง่การใช้ความจุแคช แนวทางของ Nvidia มีประสิทธิภาพกว่า

เปรียบเทียบโครงสร้างกับ Ponte Vecchio

  • Intel Ponte Vecchio(PVC) ใช้ Compute Tile เป็นบล็อกคอมพิวต์พื้นฐาน ซึ่งสอดคล้องโดยประมาณกับ XCD ของ CDNA 3
  • Base Tile ของ PVC มี last-level cache ขนาดใหญ่และคอนโทรลเลอร์หน่วยความจำ HBM คล้ายกับ IO die ของ CDNA 3
  • การ์ด PVC ก็สามารถเปิดเผยเป็น GPU เดียวและพูลหน่วยความจำแบบรวมได้เช่นเดียวกับ MI300X
  • ความต่างของสองโครงสร้างนี้ปรากฏชัดที่ขนาดชิปเล็ต การวางแคช และลิงก์ระหว่างได
    • Compute Tile ของ PVC ประกอบด้วย Xe Core 8 ตัว จึงมีขนาดเล็กกว่า XCD ของ CDNA 3 ที่มี 38 CU
    • Intel ลดความต้องการทราฟฟิกข้ามไดด้วย L1 cache ที่ใหญ่กว่า แทนการใช้แคชรวมทั้ง Compute Tile
    • หากใช้ Ponte Vecchio แบบ 2-stack เป็น GPU รวมศูนย์ EMIB bridge จะให้ได้เพียง 230GB/s ทำให้ใช้งานแบนด์วิดท์ HBM ได้ไม่เต็มที่เมื่อ stripe การเข้าถึงไปยังคอนโทรลเลอร์หน่วยความจำทั้งหมด
    • Intel มี API ที่สามารถจัดการ GPU เป็นโครงสร้าง NUMA ได้
  • ในด้านการจัดวางจริง CDNA 3 ต้องการแบนด์วิดท์สูงระหว่าง IO die ส่วน PVC อาศัยลิงก์ EMIB แบนด์วิดท์ต่ำ แต่มีความซับซ้อนด้านการออกแบบมากกว่าเพราะใช้ได 4 ประเภทและกระบวนการผลิตกับโรงงานคนละชุด
  • MI300X ใช้ไดเพียง 2 ประเภท และทั้ง 6nm กับ 5nm ก็เป็นกระบวนการของ TSMC ทั้งคู่

Infinity Cache และคอขวดของหน่วยความจำ

  • ตลอดหลายทศวรรษที่ผ่านมา ประสิทธิภาพคอมพิวต์เพิ่มขึ้นเร็วกว่าหน่วยความจำ และ GPU ก็รับมือด้วยกลยุทธ์แคชที่ซับซ้อนขึ้นเหมือน CPU
  • CDNA 2 ใช้ลำดับชั้นแคชแบบดั้งเดิมสองระดับที่พึ่งพา L2 ขนาด 8MB และ HBM2e แต่ MI250X มีปัญหาแบนด์วิดท์ไม่พอมากกว่า Nvidia H100
  • CDNA 3 เพิ่ม Infinity Cache ที่ยกมาจาก RDNA 2
    • Infinity Cache ของ MI300 ในเอกสารเทคนิคถูกเรียกว่า Memory Attached Last Level(MALL) ซึ่งเป็นแคชฝั่งหน่วยความจำ
    • มันอยู่ไกลจาก Compute Unit มากกว่า L1 และ L2 และติดอยู่กับคอนโทรลเลอร์หน่วยความจำ
    • ทราฟฟิกหน่วยความจำทั้งหมดจะผ่าน Infinity Cache และทราฟฟิก I/O กับการสื่อสารระหว่าง peer GPU ก็ได้ประโยชน์จากแบนด์วิดท์ของ Infinity Cache เช่นกัน
    • เนื่องจากมันมองเห็นสถานะล่าสุดของข้อมูลใน DRAM ตลอดเวลา จึงไม่จำเป็นต้องจัดการงานรักษาความสอดคล้องของแคชอย่าง snoop
  • โดยทั่วไปแคชฝั่งหน่วยความจำจะมี latency สูงกว่า ดังนั้น AMD จึงใช้ L2 cache ระดับหลาย MB เพื่อปกป้อง Compute Unit ทั้งใน CDNA 3 และ RDNA 2

ความจุและแบนด์วิดท์เชิงทฤษฎีของ Infinity Cache

  • Infinity Cache ของ CDNA 3 ใช้โครงสร้างแบบ 16-way set associative เช่นเดียวกับ RDNA 2
  • การนำ CDNA 3 ไปใช้งานจริงถูกปรับให้เหมาะกับ แบนด์วิดท์ มากกว่าความจุ
    • ประกอบด้วย 128 slice
    • แต่ละ slice มีความจุ 2MB และมีแบนด์วิดท์อ่าน 64 ไบต์ต่อรอบสัญญาณ
    • รวมทุก slice จะได้ 8192 ไบต์ต่อรอบสัญญาณ หรือเทียบเท่า 17.2TB/s ที่ 2.1GHz
  • Infinity Cache ขนาด 128MB ของ RDNA 2 ให้ได้ 1024 ไบต์ต่อรอบสัญญาณเมื่อรวมทุก slice หรือในทางทฤษฎี 2.5TB/s ที่ 2.5GHz
    • จาก die shots ดูเหมือนว่า Infinity Cache slice ของ RDNA 2 จะมีความจุ 4MB และให้ 32 ไบต์ต่อรอบสัญญาณ
  • MI300X สามารถให้ประสิทธิภาพที่ดีได้แม้กับเวิร์กโหลดที่มี compute density ต่ำ หากยังได้ Infinity Cache hit มากพอ
  • หากสร้างโมเดล roofline จากแบนด์วิดท์เชิงทฤษฎีของ Infinity Cache, MI300X จะเข้าถึง throughput FP64 เต็มได้ที่ 4.75 FLOPs ต่อไบต์ที่โหลด
    • แต่ถ้าใช้ DRAM อย่างเดียว จะต้องการ 14.6~15 FLOPs ต่อไบต์ที่โหลด

ข้อจำกัดของแบนด์วิดท์ข้ามได

  • Infinity Fabric ของ MI300X ครอบคลุม IO die 4 ตัว โดยแต่ละ IO die เชื่อมต่อกับ HBM stack 2 ก้อนและพาร์ทิชันแคชที่เกี่ยวข้อง
  • เมื่อ MI300X ทำงานเป็น logical GPU เดียวพร้อมพูลหน่วยความจำแบบรวม แบนด์วิดท์การเชื่อมต่อ die-to-die อาจจำกัดไม่ให้ไปถึงแบนด์วิดท์เชิงทฤษฎีเต็มของ Infinity Cache
  • คอขวดที่ระดับพาร์ทิชัน IO die เดียวเห็นได้จากการคำนวณแบนด์วิดท์
    • มีแบนด์วิดท์ขาเข้า 2.7TB/s จากสองขอบที่ติดกับ IO die ข้างเคียง
    • XCD 2 ตัวที่เชื่อมกับ IO die นั้นสามารถรับแบนด์วิดท์ Infinity Cache ได้ 4.2TB/s
    • หากคำขอที่ L2 miss ถูก stripe กระจายอย่างสม่ำเสมอทั่วทั้งได จะมี 3/4 หรือ 3.15TB/s ที่ต้องมาจาก peer die
    • เนื่องจาก 3.15TB/s มากกว่า 2.7TB/s แบนด์วิดท์ข้ามไดจึงกลายเป็นตัวจำกัดแบนด์วิดท์แคช
  • หากทุกไดในโครงสร้างแบบรวมต้องการแบนด์วิดท์ Infinity Cache สูงสุดพร้อมกัน การส่งข้อมูลระหว่างไดที่อยู่มุมตรงข้ามจะต้องผ่าน 2 hop และยิ่งกินแบนด์วิดท์ขาเข้าเพิ่มขึ้น
  • หากแบ่ง MI300X ออกเป็นหลาย NUMA domain อาจได้แบนด์วิดท์ Infinity Cache รวมสูงขึ้น
  • ค่า L2 hit rate ที่สูงช่วยลดโอกาสเกิดคอขวด และหาก Infinity Cache hit rate ต่ำ ลิงก์ die-to-die ของ MI300X ก็ยังมีแบนด์วิดท์มากพอสำหรับรองรับทราฟฟิก HBM

ความสอดคล้องระหว่าง XCD และการทำงานของ L2

  • Infinity Cache ไม่ต้องกังวลเรื่องความสอดคล้อง แต่ แคช L2 ต้องมีการจัดการแยกต่างหาก
  • การเข้าถึงหน่วยความจำของ GPU ทั่วไปเป็นไปตาม relaxed coherency model แต่โปรแกรมเมอร์สามารถบังคับ ordering ระหว่างเธรดด้วย atomics ได้
  • การเข้าถึงหน่วยความจำของ AMD GPU สามารถระบุได้ด้วยบิต GLC (Global Level Coherent)
  • ใน AMD GPU รุ่นก่อนหน้า atomics และ coherent access จะถูกจัดการที่ L2
    • load ที่ตั้งค่า GLC bit จะข้าม L1 และดึงข้อมูลล่าสุดจาก L2
    • ใน MI300X cacheline ล่าสุดอาจอยู่ใน L2 ของ XCD อื่น จึงไม่เพียงพอหากใช้วิธีนี้อย่างเดียว
  • CDNA 3 วาง Coherent Master (CM) ไว้ที่จุดเชื่อมต่อระหว่าง XCD กับ IO die คล้าย Infinity Fabric ของ Ryzen และวาง Coherent Slave (CS) ไว้ข้าง memory controller แต่ละตัวพร้อมกับ Infinity Cache slice
    • จากเอกสารของ Ryzen เราทราบว่า Coherent Slave มี probe filter และฮาร์ดแวร์สำหรับจัดการ atomic transaction
    • MI300X ก็น่าจะมีการใช้งาน CS ที่คล้ายกัน
  • เมื่อ coherent write ไปถึง CS เธรดไม่ว่าจะรันอยู่ที่ใดใน GPU ก็ควรต้องสามารถสังเกต write นั้นได้ผ่าน coherent read
    • หากเป็นการใช้งานแบบตรงไปตรงมา CS จะต้อง probe L2 ของทุก XCD
    • probe filter จะติดตามว่า XCD ใดแคช line นั้นไว้ เพื่อลด probe traffic ที่ไม่จำเป็น
    • whitepaper ของ CDNA 3 ระบุว่า snoop filter มีขนาดใหญ่พอที่จะครอบคลุม L2 cache ของหลาย XCD
  • อย่างไรก็ตาม CDNA 3 ภายใน XCD ยังทำงานคล้าย GPU รุ่นเดิม
    • memory write ทั่วไปจะไม่ invalidate line ใน peer cache โดยอัตโนมัติเหมือน CPU
    • โค้ดต้องระบุอย่างชัดเจนให้ writeback dirty L2 cache line และ invalidate non-local L2 line ใน peer L2 cache
    • เอกสาร LLVM ที่เกี่ยวข้องอธิบายการใช้ buffer_wbl2 sc1 และ buffer_inv sc0 sc1 บน GFX942 target

การปรับปรุงแคช L2 และ L1

  • XCD แต่ละตัวของ MI300X มี แคช L2 ขนาด 4MB อยู่ใกล้กับ Compute Unit
    • L2 ประกอบด้วย 16 slice
    • แต่ละ slice ขนาด 256KB ให้แบนด์วิดท์ 128 ไบต์ต่อ cycle
    • ที่ 2.1GHz เท่ากับ 4.3TB/s ต่อ XCD
  • MI300X มีอัตราส่วน L2 bandwidth-to-compute สูงกว่า H100 และ MI250X
    • เนื่องจากมี L2 อยู่ในแต่ละ XCD ผลิตภัณฑ์ CDNA 3 จึงเพิ่มแบนด์วิดท์ L2 ได้ตามธรรมชาติเมื่อเพิ่มจำนวน XCD
    • หลีกเลี่ยงปัญหาที่ต้องรักษาแบนด์วิดท์ขณะเชื่อมต่อ Compute Unit จำนวนมากเข้ากับแคชขนาดใหญ่ก้อนเดียว
  • PVC ต้องการแบนด์วิดท์ไปยัง L2 ที่ใช้ร่วมกันบน Base Tile มากขึ้นเมื่อจำนวน Compute Tile เพิ่มขึ้น
    • โครงสร้างของ PVC ทำให้ L2 เป็นทั้งจุดเดียวของความสอดคล้องและเป็น backstop ของ L1 miss จึงเรียบง่ายในมุมมองการออกแบบแคช
    • แต่ไม่สามารถให้แบนด์วิดท์สูงเท่ากับ L2 ของ MI300X ได้
  • L1 ของ CDNA 3 ก็ได้รับการปรับปรุงโดยเน้นแบนด์วิดท์เช่นกัน
    • throughput ของ L1 เพิ่มจาก 64 ไบต์ต่อ cycle เป็น 128 ไบต์ต่อ cycle
    • ความจุ L1 ก็เพิ่มจาก 16KB เป็น 32KB
    • แคชที่ใหญ่ขึ้นสามารถเพิ่ม hit rate ลด latency เฉลี่ยของการเข้าถึงหน่วยความจำ และปรับปรุงการใช้ประโยชน์ของ execution unit ได้
    • เนื่องจากการดึงข้อมูลจากระดับ L2 ขึ้นไปใช้พลังงาน การเพิ่ม hit rate จึงอาจช่วยด้านประสิทธิภาพพลังงานได้ด้วย
  • Ponte Vecchio ยังแข็งแกร่งในด้าน L1
    • แต่ละ Xe Core ให้ได้ 512 ไบต์ต่อ cycle
    • L1 มีความจุ 512KB
    • kernel แบบ memory-bound ที่พอดีกับ L1 อาจทำงานได้ดีบนสถาปัตยกรรมของ Intel
    • อย่างไรก็ตาม เนื่องจากไม่มี mid-level cache ระดับ Compute Tile ประสิทธิภาพอาจตกลงอย่างมากเมื่อข้อมูลเกินขนาด L1

การจัดตารางและ execution unit

  • นอกจากโครงสร้าง chiplet และแคชที่ทำให้ MI300X ดูเหมือนเป็น GPU เดียวแล้ว CDNA 3 ยังปรับปรุงสถาปัตยกรรม Compute Unit แบบค่อยเป็นค่อยไปเพื่อจัดการปัญหาการใช้ FP32 ของ CDNA 2
  • CDNA 2 ประมวลผล FP64 แบบเนทีฟ และให้ double-rate FP32 ผ่าน packed execution
    • คอมไพเลอร์ต้อง pack ค่า FP32 สองค่าไว้ในรีจิสเตอร์ที่อยู่ติดกันและรันคำสั่งเดียวกัน
    • หากโปรแกรมเมอร์ไม่ได้ใช้ vector อย่างชัดเจน คอมไพเลอร์มักทำสิ่งนี้ได้ไม่ดีในหลายกรณี
  • CDNA 3 เลี่ยงปัญหานี้ด้วยกลไก dual-issue ที่ยืดหยุ่นกว่า
    • ดูใกล้เคียงกับการขยายความสามารถ multi-issue ของ GCN มากกว่าวิธี VOPD/wave64 ของ RDNA 3
    • CU scheduler จะเลือกหนึ่งในสี่ SIMD ทุก cycle และตรวจสอบว่ามีเธรดที่พร้อมรันหรือไม่
    • หากมีหลายเธรดพร้อม GCN สามารถส่งได้สูงสุด 5 เธรดไปยัง execution unit
  • dual-issue ของ CDNA 3 น่าจะได้ผลเมื่อโปรแกรมเมอร์เปิดเผย thread-level parallelism ผ่าน dispatch size ที่ใหญ่ มากกว่าจะพึ่งคอมไพเลอร์
    • หาก SIMD กำลังรันเธรดมากขึ้น โอกาสที่จะพบสองเธรดที่มีคำสั่ง FP32 พร้อมกันก็จะสูงขึ้น
    • อย่างน้อยต้องมี active thread 2 ตัวต่อ SIMD จึงจะได้ throughput FP32 เต็มที่
    • ในทางปฏิบัติ มักต้องการ occupancy ที่สูงกว่านี้เพราะมี memory latency และ execution latency
  • AMD เพิ่มจำนวนเธรดที่ SIMD ของ CDNA 3 ติดตามได้อย่างมากจาก 8 เป็น 24
    • ไม่มีการกล่าวถึงการเพิ่มความจุของ vector register file และความจุนี้มักเป็นข้อจำกัดของจำนวนเธรดที่ SIMD สามารถคงไว้พร้อมกันได้
    • ความสามารถ multi-issue อาจทำงานได้ดีที่สุดกับ kernel แบบง่ายที่ใช้รีจิสเตอร์ต่อเธรดไม่มาก
  • dual-issue อาจทำให้แบนด์วิดท์ของ register file กลายเป็นปัญหาได้เช่นกัน
    • packed FP32 ของ CDNA 2 ใช้ประโยชน์จาก register file port ที่กว้างซึ่งส่งค่า 64-bit ได้ จึงไม่ต้องมีการอ่านเพิ่ม
    • คำสั่งที่แยกจากกันอาจอ้างถึงรีจิสเตอร์คนละตัวและต้องการการอ่านมากขึ้น
    • AMD ระบุว่าได้ปรับปรุง source caching ต่อเนื่องข้ามรุ่น เพื่อให้การอ่าน vector register หนึ่งครั้งรองรับ downstream vector หรือ matrix operation ได้มากขึ้น
    • เป็นไปได้ว่าใช้ register cache ที่ใหญ่ขึ้นเพื่อลด port conflict และป้อนข้อมูลให้ execution unit

การคำนวณเมทริกซ์และประสิทธิภาพ AI

  • การเติบโตของแมชชีนเลิร์นนิงทำให้ การคูณเมทริกซ์ มีความสำคัญมากขึ้น และ Nvidia ก็ลงทุนอย่างมากในด้านนี้ด้วยการเพิ่ม tensor core ใน Volta และ Turing
  • AMD CDNA รองรับ matrix multiply เช่นกัน แต่สถาปัตยกรรม Nvidia ในยุคเดียวกันลงทุนกับ throughput ของการคำนวณเมทริกซ์สำหรับชนิดข้อมูลความละเอียดต่ำอย่าง FP16 มากกว่า
  • MI300X เพิ่ม matrix throughput ต่อ CU ขึ้น 2 เท่าเมื่อเทียบกับ CDNA รุ่นก่อนหน้า
  • การออกแบบแบบชิปเล็ตของ MI300X ทำให้มี CU ได้จำนวนมากมาก และเพิ่ม throughput โดยรวม
  • Nvidia ยังเป็นคู่แข่งที่แข็งแกร่งเพราะมีประสิทธิภาพด้านเมทริกซ์ต่อ SM สูง และ CDNA 3 ก็ยังคงประสิทธิภาพ AI ที่แข็งแกร่งในตัวเอง พร้อมกดดัน Nvidia อย่างหนักด้วยประสิทธิภาพ vector FP64 ตามแนวทางของ AMD

การเปลี่ยนแปลงของแคชคำสั่ง

  • Compute Unit ต้องดึงทั้งข้อมูลจากหน่วยความจำและตัวคำสั่งเองจากหน่วยความจำ
  • โดยทั่วไปโค้ด GPU มีความเรียบง่ายและขนาดโค้ดเล็ก ทำให้การส่งมอบคำสั่งทำได้ค่อนข้างง่าย
  • GPU ตระกูล CDNA 2 และ RDNA ใช้ instruction cache ขนาด 32KB มาโดยตลอด แต่ CDNA 3 เพิ่มเป็น 64KB
    • associativity ก็เพิ่มจาก 4-way เป็น 8-way
    • ช่วยเพิ่มอัตรา instruction cache hit ใน kernel ที่มีขนาดใหญ่และซับซ้อนขึ้น
  • ดูเหมือนว่า AMD จะคำนึงถึงกรณีที่มีการย้ายโค้ด CPU มายัง GPU แบบตรงไปตรงมา
    • โค้ด CPU ที่ซับซ้อนอาจกลายเป็นภาระบน GPU
    • GPU ซ่อน latency จาก instruction cache miss ได้ยากกว่าด้วย instruction prefetching ระยะไกลและ branch prediction ที่แม่นยำ
    • instruction cache ที่ใหญ่ขึ้นช่วยรองรับ kernel ขนาดใหญ่ และ associativity ที่สูงขึ้นช่วยลด conflict miss
  • instruction cache instance ของ CDNA 3 ยังคงถูกแชร์โดย Compute Unit สองชุดเหมือน CDNA 2
    • โดยปกติ GPU kernel จะรันด้วย work size ที่ใหญ่พอจะเติม Compute Unit ได้จำนวนมาก ดังนั้นการแชร์ instruction cache จึงเป็นวิธีใช้ SRAM อย่างมีประสิทธิภาพ
    • หากมี Compute Unit มากขึ้นมาแชร์ cache instance เดียว ก็อาจทำให้ตอบสนองความต้องการด้าน instruction bandwidth ได้ยากขึ้น

ความแตกต่างระหว่าง MI300X และ MI300A

  • การเปลี่ยนแปลงข้ามรุ่นที่ใหญ่ที่สุดของ CDNA 3 คือชั้นลำดับหน่วยความจำ และการปรับปรุงสำคัญจริง ๆ อยู่ที่การเพิ่ม Infinity Cache
  • ปัญหาหลักของ MI250X คือมันใกล้เคียงกับการเป็น GPU สองตัวที่ใช้แพ็กเกจเดียวกัน มากกว่าจะเป็น GPU ตัวเดียว
    • แบนด์วิดท์ระหว่าง GCD ทั้งสองอยู่ที่ 200GB/s ต่อทิศทาง
    • AMD มองว่าแบนด์วิดท์ระดับนี้ยังไม่พอที่จะทำให้ MI250X ดูเป็น GPU ตัวเดียว จึงเพิ่มแบนด์วิดท์ die-to-die อย่างมาก
  • MI300 เพิ่ม East-West aggregate bandwidth เป็น 2.4TB/s ต่อทิศทาง หรือมากกว่า MI250X ถึง 12 เท่า
    • North-South aggregate bandwidth สูงกว่านั้นอีกที่ 3.0TB/s ต่อทิศทาง
    • การเพิ่มแบนด์วิดท์นี้ทำให้ MI300 สามารถดูเป็นตัวเร่งความเร็วแบบรวมศูนย์ขนาดใหญ่เพียงตัวเดียว แทนที่จะเหมือนตัวเร่งความเร็ว 2 ตัวแบบ MI250X
  • ingress bandwidth รวม 4.0TB/s ของ IO die เดียวเกือบสอดคล้องกับ 4.2TB/s ที่ XCD สองตัวใช้งานได้ จึงแทบไม่ใช่ปัญหาในทางปฏิบัติ
    • อย่างไรก็ตาม IO die เดียวไม่สามารถใช้ประโยชน์จากแบนด์วิดท์หน่วยความจำรวม 5.3TB/s ได้ทั้งหมด
    • คล้ายกับกรณีใน Ryzen 7000 ที่ CCD เดียวไม่สามารถใช้แบนด์วิดท์ DDR5 ได้เต็มที่เพราะข้อจำกัดของ Infinity Fabric
    • ใน MI300X ความต้องการแบนด์วิดท์จะสูงที่สุดเมื่อทุกไดทำงานร่วมกัน และในกรณีนั้นแต่ละไดจะใช้ประมาณ 1.3TB/s ดังนั้นการดึง 3/4 ผ่าน cross-die link จึงไม่ใช่ปัญหา
  • MI300A เป็น APU ระดับ “big iron” ที่นำ base die เดิมกลับมาใช้ร่วมกับ CDNA3 XCD 6 ตัวและ Zen 4 core 24 คอร์
    • CPU และ GPU สามารถแชร์พื้นที่ address หน่วยความจำเดียวกันได้
    • ไม่จำเป็นต้องคัดลอกข้อมูลผ่านบัสภายนอกเพื่อรักษาความสอดคล้องกันระหว่าง CPU และ GPU อีกต่อไป

1 ความคิดเห็น

 
GN⁺ 2023-12-19
ความคิดเห็นจาก Hacker News
  • นี่คือเหตุผลที่การ์ดสำหรับผู้บริโภคของ AMD คำนวณไม่ได้หรือเปล่า? ผมนึกว่าเป็นแค่ กลยุทธ์แยกผลิตภัณฑ์ ที่ทำแบบครึ่ง ๆ กลาง ๆ แต่ฟังดูเหมือนเป็น ปัญหาระดับสถาปัตยกรรมชั้นบน ราวกับทางด่วนที่ไม่มีทางขึ้น ซึ่งดูค่อนข้างร้ายแรง
    • โดยทั่วไปนักพัฒนาซอฟต์แวร์จะรองรับ API สำหรับ GPU อเนกประสงค์เพียงตัวเดียว และ API นั้นก็คือ nVidia CUDA
      ในเชิงเทคนิค การ์ดสำหรับผู้บริโภคของ AMD มีประสิทธิภาพการคำนวณที่ยอดเยี่ยม เช่น UE5 เรนเดอร์ mesh สามเหลี่ยมด้วยการคำนวณแทนกราฟิกไปป์ไลน์ https://www.youtube.com/watch?v=TMorJX3Nj6U
      ยิ่งไปกว่านั้น เพราะ nVidia ให้ความสำคัญกับ ray tracing และ DLSS มากกว่าประสิทธิภาพการคำนวณกับแบนด์วิดท์หน่วยความจำ การ์ด AMD จึงมักนำหน้าการ์ด nVidia ระดับเดียวกันอยู่บ่อยครั้ง
      ปัญหาคือไม่มีบริษัทเทคโนโลยีไหนอยากเพิ่มแบ็กเอนด์ D3D หรือ Vulkan ให้ไลบรารี AI อย่าง PyTorch nVidia ไม่ทำเพราะชอบสถานะเดิม ส่วน Intel และ AMD ก็ไม่ทำเพราะพยายามแทนที่ CUDA ด้วยทางเลือกกรรมสิทธิ์ของตัวเอง แทนที่จะใช้ GPU API แบบเปิด
    • การ์ดสำหรับผู้บริโภคของ AMD ก็คำนวณได้ แต่ อีโคซิสเต็มยังไม่สุกงอมและการสนับสนุนก็อ่อน ROCm แทบจะเรียกได้ว่ายุ่งเหยิง
      อย่างไรก็ตาม มันไม่ใช่ทั้งการแยกผลิตภัณฑ์แบบครึ่ง ๆ กลาง ๆ และไม่ใช่ปัญหาระดับสถาปัตยกรรมชั้นบน ผลิตภัณฑ์เฉพาะทางย่อมทำงานในสาขาของตัวเองได้ดีกว่าผลิตภัณฑ์อเนกประสงค์ ความต้องการการ์ดที่เก่งทั้งงานคำนวณและเกมมีน้อย และถึงจะมีคนแบบนั้นอยู่ ก็ยังน้อยกว่าคนที่สนใจแค่ด้านใดด้านหนึ่ง
      ผลจากการแยก GCN ออกเป็น RDNA และ CDNA เห็นได้ทันที ถ้าเทียบ Radeon VII (GCN 5) กับ RX 5700 XT (RDNA 1) ในเกมสองรุ่นนี้สูสีผลัดกันแพ้ชนะ และโดยเฉลี่ย Radeon VII นำอยู่นิดหน่อย แต่ RX 5700 XT แพ้ขาดใน benchmark งานคำนวณ ทั้งคู่ใช้ TSMC 7nm แต่ RX 5700 XT มี shader น้อยกว่า (2560 ต่อ 3840), die เล็กกว่า (251 ต่อ 311 mm2) และใช้พลังงานต่ำกว่า (225 ต่อ 300 W) จึงแสดงให้เห็นว่าประสิทธิภาพต่อพลังงานในเกมดีกว่ามาก ด้วยพลังงานที่ต่ำกว่า เสียงรบกวนต่ำกว่า และราคาถูกกว่าหลายร้อยดอลลาร์ มันจึงเป็นการ์ดที่ดึงดูดเกมเมอร์กว่ามาก
      การ์ด CDNA ดูเหมือนจะขาดองค์ประกอบที่จำเป็นต่อเกม เช่น render output unit จึงไม่มีการรองรับ DirectX, OpenGL, Vulkan อย่างเป็นทางการ ผมไม่เคยเห็นกรณีที่เอามันไปรันเกมเลย แต่แทนที่จะเป็นแบบนั้น ประสิทธิภาพการคำนวณของมันดีมากจนหลายบริษัทซื้อการ์ดเหล่านี้แทน nVidia แม้จะมีอีโคซิสเต็ม CUDA ที่เหนือกว่าอย่างล้นหลามก็ตาม ในปี 2013 มีซูเปอร์คอมพิวเตอร์ที่ใช้ GCN เครื่องหนึ่งติด 100 อันดับแรก และนั่นเป็นระบบที่ใช้ GCN เพียงระบบเดียวใน 100 อันดับแรก ตอนนี้ซูเปอร์คอมพิวเตอร์ 8 ใน 10 อันดับแรกด้านประสิทธิภาพพลังงานใช้ ตัวเร่งความเร็ว CDNA และซูเปอร์คอมพิวเตอร์ที่เร็วที่สุดอันดับ 1 โดยรวมก็ใช้ CDNA
    • เมื่อ 2 เดือนก่อน มีการเพิ่มการรองรับการ์ด Radeon ระดับสูง ROCm จะมาสู่ RDNA โดยรวม “สักวันหนึ่ง” แต่เป็นกระบวนการที่ช้า และโดยรวมก็สอดคล้องกับวิธีที่ AMD จัดการ ROCm มาตั้งแต่ต้น คือเริ่มจากกลุ่มย่อยของงานคำนวณที่เล็กมาก แล้วค่อย ๆ ขยายในแต่ละเวอร์ชันหลัก
      https://www.tomshardware.com/news/amd-enables-rocm-and-pytor...
    • AMD ไม่เคยนำ ATI ได้ดีเลย
      โดยพื้นฐานแล้วเป็นบริษัทฮาร์ดแวร์ (เช่นเดียวกับประวัติของ Lisa Su) และยอมรับได้ช้าเกินไปว่า CUDA คือหมัดเด็ด ผมจำได้ว่า @Bridgman ใน Phoronix เคยสู้ถอยหลังเพื่อพยายามรั้งนักพัฒนาไว้ มันเป็นศึกที่ไม่มีทางชนะ
      ก็พอเข้าใจได้อยู่บ้าง คนรุ่นฮาร์ดแวร์ยุค 80/90 มักมองโดยสัญชาตญาณว่าฮาร์ดแวร์อยู่บนสุดของสแตก และผู้บริหาร AMD รวมถึง Su ก็มาจากสายนี้ทั้งนั้น
      Kodura เข้าใจว่า nVidia กำลังกด AMD ได้เหนือกว่าเพราะ CUDA รันบนการ์ดสำหรับผู้บริโภคได้ด้วย ดังนั้นเขาจึงผลักดัน Radeon VII สู้กับ Lisa Su และการ์ดใบนั้นก็เป็นการ์ดสำหรับผู้บริโภคเพียงรุ่นเดียวที่ ROCm รองรับอยู่หลายปีจนกระทั่งไม่นานมานี้ เขาถูกปลดออกไปโดยพฤตินัยหลังจากนั้นไม่นาน และ RVII ซึ่งเป็นการ์ดที่ยอดเยี่ยมก็ถูกพับไปอย่างรวดเร็ว จากนั้น Wang ก็เข้ามาและทำให้การแยกระหว่างรุ่นผู้บริโภค/มืออาชีพแน่นหนาขึ้น
      ตอนนี้ AMD กำลังพยายามย้อนกลับอย่างสิ้นหวัง แต่มันสายเกินไปแล้ว มีหลายฝ่ายที่พยายามแข่งขัน แต่ที่แทบจะพอพูดถึงได้จริง ๆ ก็มีแค่ AAPL กับ Metal เท่านั้น
      AMD พลาดโอกาสไปแล้ว
    • การแยกน่าจะเกิดราวปี 2016 เมื่อคิดถึงสถานการณ์คริปโตตอนนั้นก็สมเหตุสมผล หนึ่งในปัญหาที่กระทบ nVidia หนักกว่า AMD คือการ์ดสำหรับผู้บริโภคถูกดูดเข้าเหมืองขุดไปหมด AMD แยกอย่างตั้งใจ จึงเท่ากับกั้นการ์ดสำหรับงานคำนวณกับการ์ดสำหรับเกมเมอร์ออกจากกันโดยพฤตินัย
      ถึงอย่างนั้น ผมก็ไม่คิดว่านี่จะเป็นผลดีต่อการนำการ์ด AMD ไปใช้กับงานคำนวณ จุดยอดเยี่ยมของ CUDA คือ ไม่ต้องใช้การ์ดเร่งความเร็วพิเศษเพื่อพัฒนาโค้ด CUDA
  • ในอนาคตอันใกล้ AMD ดูไม่น่าจะแข่งกับ NVidia ได้ เพราะนักวิทยาศาสตร์จำนวนมากที่สร้างไลบรารีหลักด้าน ML/AI ได้รับ GPU จาก NVidia ฟรีหรือในราคาลดมาก
    ถ้าพวกเขาต้องซื้อ GPU ด้วยเงินตัวเองหรือทุนวิจัยในราคาเดียวกับผู้บริโภคทั่วไป สถานการณ์อาจต่างออกไปก็ได้
    โดยส่วนตัว ผมมองว่าวิธีที่ NVidia แทรกซึมเข้าไปในแวดวงวิชาการและสภาพแวดล้อมวิจัยของมหาวิทยาลัยนั้น ไร้จริยธรรมมาก
    • Nvidia เริ่มทุ่มทรัพยากรและเวลาให้เรื่องนี้มานานกว่า 10 ปีแล้ว CUDA ออกมาในปี 2007 และตอนนั้นกระแส ML/AI แบบปัจจุบันยังไม่มีอยู่ด้วยซ้ำ
      หลังจากนั้นพวกเขาก็รอต่อไป และเดิมพันบริษัทหลายครั้งกับความเชื่อว่าตลาดสำหรับผลิตภัณฑ์ที่พวกเขาสร้างจะ “มาถึง”
      ในช่วงไม่กี่ปีที่ผ่านมา สิ่งนั้นเกิดขึ้นจริง และสะท้อนในราคาหุ้นแล้ว ผู้เล่นรายอื่นโดยพื้นฐานแล้วตามหลังอยู่ 10 ปี และเมื่อดูจากกระแสร้อนแรงตอนนี้กับการแพร่หลายของเวิร์กโฟลว์ AI/ML ก็แทบเป็นไปไม่ได้ที่ใครจะไล่ทัน
    • ในวงการนี้ยังมี ความรู้สึกไม่ดี ต่อ AMD อยู่มาก ผมรู้จักหลายคนที่ช่วงแรกใช้เวลามากเพื่อพยายามรองรับทั้ง GPU ของ Nvidia และ AMD แต่ AMD เคยหยุดรองรับ API ทำให้โค้ดของพวกเขาใช้การไม่ได้
      ในทางกลับกัน โค้ด CUDA ยังคงทำงานได้แม้การ์ด Nvidia รุ่นใหม่ ๆ จะออกมา
    • ผมไม่แน่ใจว่าคำพูดนี้ถูกต้องแค่ไหน ผมกำลังสนับสนุนนักวิจัยในมหาวิทยาลัยที่ทำวิจัย “AI” ตามที่มักเรียกกัน เช่น LLM, computer vision และการ์ดที่ NVIDIA ลดราคาให้เพื่อการศึกษามีแค่ A5000 เท่านั้น อาจมีการ์ดอีกใบที่พวกเขาไม่สนใจอยู่ด้วย (L40?)

ส่วนใหญ่กำลังซื้อ A6000 ขึ้นไปในราคาผู้บริโภคจากบริษัทอย่าง Exxact หรือ Supermicro
ตั้งแต่ยุค V100 หรือก็คือหลังระบบ DGX-1 ผมไม่เคยเห็นนักวิจัยได้รับ GPU ฟรีเลย

  • ไม่มีอะไรขวางไม่ให้ AMD แจกการ์ดฟรีให้บรรดานักพัฒนา
  • ผมมองว่าคำกล่าวที่ว่า “การประมวลผลแซงหน้าหน่วยความจำมาหลายสิบปี และ GPU ก็รับมือด้วยกลยุทธ์แคชที่ซับซ้อนขึ้นเรื่อย ๆ เหมือน CPU” นั้นค่อนข้างตรงกันข้าม
    ต่างจาก CPU, GPU ไม่ได้พยายามชดเชยสิ่งนี้โดยตรง แต่ยอมรับ latency ที่สูงกว่า แล้วใช้การทำงานแบบขนานที่กว้างกว่ามาก หรือพูดได้ว่าหนักมือกว่า CPU และ pseudo-thread จำนวนมากที่ทำงานขนานกันก็ช่วยให้เกิดผลของ การซ่อน latency
    ผลนี้ดูได้จากตัวอย่างเช่นงานนำเสนอเรื่องการปรับแต่งโค้ด GPU
    https://www.olcf.ornl.gov/wp-content/uploads/2019/12/03-CUDA...
    แอนิเมชันตั้งแต่สไลด์ 11 เป็นต้นไปเป็นตัวอย่างของเรื่องนี้
    • GPU ยังจัดการหน่วยความจำด้วยวิธีอื่นนอกจากการขนานด้วย ดังนั้น GPU จึงมักมี register file ขนาดใหญ่ (ใน RDNA1 มี architectural register ได้สูงสุด 256 ตัวต่อเธรด) และ local memory (ใน RDNA1 มี LDS ได้สูงสุด 64KB ต่อ work group)
      กล่าวคือ งานจำนวนมากสามารถประมวลผลได้ล้วน ๆ ใน register และ LDS และการเข้าถึง global memory ก็เกิดขึ้นน้อยกว่า CPU มาก ซึ่งแทบทุกอย่างอยู่ใน global memory และมี architectural register ราว ๆ 16 ตัวเท่านั้น
      ถึงอย่างนั้น global memory ก็ยังเป็นปัญหา เพราะไม่ใช่แค่ latency แต่ แบนด์วิดท์ ก็เป็นปัญหาด้วย นั่นจึงเป็นเหตุผลที่ RDNA2 และ Ada เพิ่มแคชขั้นสุดท้ายปริมาณมากเข้ามา ส่วนหนึ่งเพื่อซ่อน latency ให้ดีขึ้น แต่เป้าหมายหลักคือทำหน้าที่เป็น ตัวขยายแบนด์วิดท์
  • ผมไม่ค่อยรู้เรื่อง VLIW มาก่อน แต่มันน่าสนใจทีเดียว
    Very long instruction word(VLIW) หมายถึงสถาปัตยกรรมชุดคำสั่งที่ออกแบบมาเพื่อใช้ประโยชน์จาก instruction-level parallelism (ILP) โดยทั่วไปหน่วยประมวลผลกลาง (CPU) มักให้โปรแกรมระบุเพียงคำสั่งที่จะรันตามลำดับ แต่โปรเซสเซอร์ VLIW ทำให้โปรแกรมระบุได้อย่างชัดเจนว่าคำสั่งใดจะรันแบบขนานกัน การออกแบบนี้มีเป้าหมายเพื่อให้ได้ประสิทธิภาพสูงขึ้นโดยหลีกเลี่ยงความซับซ้อนที่แฝงอยู่ในวิธีอื่น
    วิธีดั้งเดิมในการเพิ่มประสิทธิภาพโปรเซสเซอร์มีทั้ง pipelining ที่แบ่งคำสั่งออกเป็นขั้นย่อย ๆ แล้วรันบางส่วนพร้อมกัน, สถาปัตยกรรม superscalar ที่ส่งคำสั่งแต่ละคำสั่งไปให้ส่วนต่าง ๆ ของโปรเซสเซอร์รันอย่างอิสระ และแม้แต่ out-of-order execution ที่รันคำสั่งคนละลำดับกับโปรแกรม วิธีเหล่านี้ทำให้ฮาร์ดแวร์ซับซ้อน เพราะโปรเซสเซอร์ต้องตัดสินใจทั้งหมดภายในเอง
    https://en.wikipedia.org/wiki/Very_long_instruction_word
    • ตัวอย่างที่โด่งดังที่สุดของโปรเซสเซอร์ VLIW คือ Itanic ไม่สิ Itanium
      มันไม่ค่อยประสบความสำเร็จ จึงถูกเรียกว่า Itanic
      สมมติฐานคือคอมไพเลอร์จะสามารถวิเคราะห์ dependency แบบสแตติกได้ดีพอที่จะใส่เส้นทางการรันตามลำดับหลายเส้นทางและเส้นทางการรันบางส่วนที่มี branch ไว้ในคำสั่งเดียวกันได้ แต่ในทางปฏิบัติกลับพบว่าคอมไพเลอร์ทำแบบนั้นไม่ได้ โปรเซสเซอร์จึงต้องค้นหา dependency และคำสั่งที่ทำขนานได้จากสตรีมคำสั่งตามลำดับแบบไดนามิกแทน
      สิ่งนี้ต้องใช้ทั้งงานจำนวนมาก ทรัพยากรชิปจำนวนมาก และพลังงานจำนวนมาก และมันทำงานได้ดีแค่ถึงจุดหนึ่ง จากนั้นก็ชนกับผลตอบแทนที่ลดลงเรื่อย ๆ ดูเหมือนว่าจุดที่เราอยู่กันตอนนี้ก็คือตรงนั้น
    • ควรอ่านเรื่อง SIMD โดยรวมไว้ด้วย
      มันไม่ได้หมายถึงภาษาที่ใช้ส่งคำสั่ง แต่หมายถึงวิธีประมวลผลเอง
      และควรจำไว้ด้วยว่าคำอย่าง VLIW4 หรือ VLIW5 หมายถึงการใช้งานจริงเฉพาะแบบ
      https://en.wikipedia.org/wiki/Single_instruction,_multiple_d...
  • มีลัดไดต์คนหนึ่งอยู่ตรงนี้ที่เคยบอกว่า AMD จะใช้ความรู้เรื่อง ชิปเล็ตและ bus fabric โต้กลับใน AI ผมจะไม่ prétend ว่าอ่านบทความนี้ได้ หรือแม้แต่อ่านตัวบทความเองได้ด้วยซ้ำ แต่อยากปักธงไว้ก่อน
  • นอกเรื่องนิดหน่อย แต่ “compute” เริ่มถูกใช้เป็นคำนามตั้งแต่เมื่อไหร่กัน? ฟังแล้วขัดหูมาก
    • เท่าที่จำได้ก็อย่างน้อยตั้งแต่ช่วง AWS เริ่มมาแรง “Amazon Elastic Compute Cloud(EC2)” เปิดตัวในปี 2006 [0] ลองดู Google Trends ด้วยก็ได้ [1]
      0: https://en.m.wikipedia.org/wiki/Amazon_Elastic_Compute_Cloud
      1: https://trends.google.com/trends/explore?date=all&q=Compute&...
    • ใน Deep Space Nine(1999) ก็มีสำนวนแบบนั้นอยู่เหมือนกัน ดังนั้นอาจเป็นคำที่ใช้ได้แม่นยำมากตามความรู้สึกของยุคนั้น หรือไม่ก็เป็นสำนวนที่ฮิตแล้วหายไปวนซ้ำ
    • ช่วงนี้มันใช้กันค่อนข้างบ่อยเพราะ AI กับชิปคล้าย GPU
    • เป็นคำที่ได้ยิน อ่าน และเขียนทุกวัน แต่ในที่ทำงานของผมคิดว่ามันโผล่มาประมาณ 5 ปีก่อน และเริ่มใช้กันทั่วไปตั้งแต่ราว 2 ปีก่อน