- HipKittens là bộ primitive lập trình được thiết kế để khai thác hiệu năng tiềm năng của GPU AMD, tối ưu hóa truy cập bộ nhớ, lập lịch và tái sử dụng cache
- GPU AMD MI355X có cấu trúc 256 compute unit và 8 chiplet (XCD), đồng thời cung cấp register file lớn và các lệnh matrix core chi tiết hơn
- Khác với NVIDIA, AMD không có phân bổ lại register, lệnh ma trận bất đồng bộ, mbarrier, nên thay vì wave specialization, cách lập lịch 8-wave ping-pong và 4-wave interleave hiệu quả hơn
- HipKittens cải thiện tính cục bộ của cache L2 và LLC thông qua lập lịch grid nhận biết chiplet, đạt được mức tăng băng thông và TFLOPS tối đa trong các phép toán GEMM và Attention
- Cách tiếp cận này bù đắp cho độ trưởng thành phần mềm còn thiếu của hệ sinh thái GPU AMD, đồng thời tạo nền tảng để nâng cao khả năng mở rộng AI computing trên phần cứng đa dạng
Kiến trúc và đặc tính hiệu năng của GPU AMD CDNA
- GPU AMD MI355X gồm 256 compute unit (CU), mỗi CU được cấu thành từ 4 SIMD
- Mỗi SIMD thực thi một wave gồm 64 luồng, đối lập với warp 32 luồng của NVIDIA
- MI355X có SRAM chỉ ở mức khoảng 70% của B200 (165KB) và không có các tính năng lệnh nhân ma trận bất đồng bộ, phân bổ lại register, tăng tốc tensor memory, mbarrier
- Ngược lại, nó cung cấp register file lớn gấp 2 lần và nhiều bộ xử lý hơn 60% (256 CU so với 160 SM)
- Hỗ trợ các lệnh matrix core nhỏ và chi tiết, cùng khả năng nạp trực tiếp từ global vào shared memory (tương tự TMA)
- AMD áp dụng kiến trúc chiplet gồm 8 chiplet (XCD), mỗi XCD có cache L2 riêng biệt, phía trên là cache LLC
- Theo bảng so sánh, MI355X đạt BF16 2.5 PFLOPs, MXFP8 5.0 PFLOPs, MXFP6 10.1 PFLOPs, cùng 288GB bộ nhớ và băng thông 8TB/s
Thách thức khi thiết kế kernel cho AMD
- Tối ưu truy cập bộ nhớ: do các ràng buộc của compiler HIPCC và hành vi I/O không được công khai, việc thiết kế bố trí dữ liệu và mẫu swizzle là rất quan trọng
- Lập lịch trong bộ xử lý: AMD cần tận dụng register file và các lệnh ma trận nhỏ thay vì dựa vào shared memory
- Lập lịch giữa các bộ xử lý: do cấu trúc dựa trên chiplet, cần phân phối công việc có tính đến hiệu ứng NUMA ở cấp cache
Mẫu truy cập bộ nhớ của HipKittens
- HipKittens (HK) dùng tile làm đơn vị dữ liệu cơ bản và cung cấp các hàm toán tử tương tự PyTorch
- Tile được định nghĩa bởi kiểu dữ liệu, kích thước, layout và hỗ trợ nhiều đầu vào khác nhau thông qua C++ template metaprogramming
- Lập lịch register: vì HIPCC không thể luôn dùng các register cụ thể làm đầu vào MFMA, HK cung cấp khả năng cố định register một cách tường minh
- Nhờ đó, lập trình viên có thể tự chỉ định register để viết kernel đạt hiệu năng tối đa
- Layout register: trên AMD, layout thay đổi tùy kiểu dữ liệu và dạng ma trận nên không thể dùng một mẫu swizzle duy nhất
- Ví dụ, tile bf16 16×16 và tile bf16 16×32 cần các mẫu swizzle khác nhau
- Cấu trúc phase của lệnh: các lệnh shared memory của AMD có nhóm phase không liên tục và tài liệu nội bộ còn thiếu
- HK cung cấp solver được reverse engineering cho phần này
- Sinh địa chỉ: AMD hỗ trợ nạp bất đồng bộ từ HBM vào shared memory, và tối ưu thông qua swizzle địa chỉ HBM
Lập lịch trong bộ xử lý: mẫu Wave
- Wave specialization hiệu quả trên NVIDIA, nhưng trên AMD lại làm giảm hiệu năng do thiếu khả năng phân bổ lại register
- Wave producer chiếm các register không cần thiết, còn wave consumer bị thiếu register nên phát sinh spill
- Kết quả thử nghiệm của HK cho thấy wave specialization trên AMD gây giảm cường độ tính toán và tạo nút thắt bộ nhớ
- Ví dụ: trong GEMM, cấu hình HK 0/8 đạt 1605 TFLOPs, CUTLASS đạt 1570 TFLOPs
- Các mẫu lập lịch thay thế
- 8-wave ping-pong: hai wave luân phiên chạy cụm bộ nhớ/tính toán
- 4-wave interleave: một wave đan xen chi tiết giữa bộ nhớ và tính toán
- 8-wave cho mã gọn hơn, còn 4-wave chi tiết hơn nhưng mã dài hơn
- Trong GEMM và Attention Forward, 8-wave đạt hiệu năng ở mức SoTA
Lập lịch giữa các bộ xử lý: cách tiếp cận nhận biết chiplet
- AMD MI355X có 8 chiplet XCD, mỗi chiplet sở hữu cache L2 độc lập
- Các thread block được gán vào chiplet theo kiểu round-robin, nên thứ tự grid ảnh hưởng trực tiếp đến hiệu quả tái sử dụng cache
- Cách bố trí row-major đơn giản có tỷ lệ tái sử dụng cache L2 thấp, gây mất băng thông
- Ví dụ: L2 55%, LLC 95%, 15.1 TB/s, 1113 TFLOPs
- HK đưa vào lập lịch grid nhận biết chiplet, tận dụng đồng thời tính cục bộ của cache L2 và LLC
- Các thread block được nhóm theo các vùng lân cận của ma trận đầu ra để tối đa hóa việc tái sử dụng dữ liệu đầu vào
Ví dụ kernel thực tế
- Hot loop của các kernel Attention Forward và BF16 GEMM sử dụng lịch 8-wave ping-pong của HK
- Mỗi vòng lặp luân phiên thực thi cụm Compute–Memory và đồng bộ bằng schedule barrier
- Trong ví dụ mã, các phép toán HK như mma_AtB, load, exp2, col_sum được dùng lặp lại
Kết luận: AMD trong kỷ nguyên AI đa silicon
- HipKittens đạt được hiệu năng cạnh tranh trên AMD CDNA3 và CDNA4
- Ba điểm cốt lõi gồm: truy cập bộ nhớ tối ưu, lập lịch wave tập trung cho AMD, và lập lịch grid nhận biết chiplet
- Các kernel HK đạt hiệu năng tốt nhất theo chuẩn AMD và có mức cạnh tranh với cả kernel NVIDIA Blackwell
- Để tăng tính đa dạng cho AI computing, cần mở rộng khả năng tiếp cận GPU AMD, và HipKittens cung cấp nền tảng phần mềm cốt lõi cho mục tiêu đó
- Việc cải thiện lập lịch register trong HIPCC được xem là hướng phát triển quan trọng trong tương lai
1 bình luận
Ý kiến Hacker News