- Hiểu biết cơ bản về GPU computing là điều thiết yếu đối với mọi kỹ sư phần mềm
- Bài viết này chủ yếu tập trung vào GPU Nvidia và sử dụng thuật ngữ của Nvidia
- GPU được thiết kế cho xử lý song song quy mô lớn và thông lượng cao trong đồ họa, tính toán số, deep learning và nhiều lĩnh vực khác
So sánh CPU và GPU
- CPU được thiết kế để thực thi lệnh tuần tự và bao gồm nhiều tính năng nhằm giảm độ trễ khi thực thi lệnh.
- GPU được thiết kế cho xử lý song song quy mô lớn và thông lượng cao, đồng thời có độ trễ thực thi lệnh từ trung bình đến cao.
- GPU có thể xử lý số lượng phép toán lớn hơn rất nhiều và nhanh hơn nhiều so với CPU.
# Kiến trúc GPU
Kiến trúc tính toán của GPU
- GPU được cấu thành từ một mảng các streaming multiprocessor (SM).
- Mỗi SM bao gồm nhiều streaming processor (core hoặc thread).
- SM có một lượng bộ nhớ on-chip hạn chế (shared memory hoặc scratchpad) được tất cả các core cùng chia sẻ.
Kiến trúc bộ nhớ của GPU
- GPU có nhiều loại bộ nhớ khác nhau theo nhiều tầng phân cấp.
- Mỗi SM có một lượng lớn thanh ghi, và chúng được chia sẻ giữa các core.
- Constant cache được dùng để cache dữ liệu hằng số được sử dụng trong quá trình thực thi mã.
- Shared memory là bộ nhớ SRAM on-chip có thể lập trình, nhanh và có độ trễ thấp.
- L1 cache lưu trữ dữ liệu thường xuyên được truy cập từ L2 cache.
- L2 cache được tất cả các SM cùng chia sẻ và cache dữ liệu thường xuyên được truy cập từ global memory.
- Global memory là DRAM dung lượng lớn, băng thông cao, nằm xa SM nên có độ trễ cao.
# Hiểu mô hình thực thi của GPU
Giới thiệu ngắn gọn về CUDA kernel và thread block
- CUDA là giao diện lập trình để viết chương trình cho GPU Nvidia.
- Kernel là phần tính toán được biểu diễn dưới dạng tương tự một hàm C/C++ chạy song song trên GPU.
- Để thực thi kernel, một số lượng thread được gọi là grid sẽ được khởi chạy.
Các bước thực thi kernel trên GPU
- Sao chép dữ liệu từ host sang device
- Lập lịch thread block lên SM
- Single Instruction Multiple Threads (SIMT) và warp
- Lập lịch warp và che giấu độ trễ
- Sao chép dữ liệu kết quả từ device về bộ nhớ host
# Khái niệm phân chia tài nguyên và occupancy
- Mức độ sử dụng tài nguyên GPU được đo bằng chỉ số "occupancy", thể hiện tỷ lệ giữa số warp được cấp phát và số warp tối đa mà một SM có thể hỗ trợ.
- Occupancy bị giới hạn bởi tài nguyên thực thi của SM, thanh ghi, shared memory, số slot thread block và số slot thread.
- Điều quan trọng là tối ưu mã để duy trì occupancy cao trong khi vẫn giảm thiểu độ trễ.
# Tóm tắt
- GPU được cấu thành từ nhiều SM, và mỗi SM có nhiều core xử lý.
- Global memory nằm xa chip và có độ trễ cao.
- L1 và L2 cache hoạt động tương tự như cache L1/L2 của CPU.
- Mỗi SM có shared memory và bộ nhớ này được chia sẻ giữa các core.
- Để chạy kernel trên GPU, một grid các thread sẽ được khởi chạy.
- GPU phân bổ các block để chạy trên SM, và mọi thread trong block đều chạy trên cùng một SM.
- Các thread được gán cho SM tiếp tục được nhóm lại thành các đơn vị 32 thread gọi là warp.
- GPU thực hiện phân chia tài nguyên động giữa các thread tùy theo yêu cầu của thread và giới hạn của SM.
# Kết luận
- GPU ngày nay được sử dụng rất rộng rãi, và kiến trúc cũng như mô hình thực thi của nó khác biệt căn bản so với CPU.
- Bài viết này đề cập đến nhiều khía cạnh khác nhau của GPU, đồng thời mang lại góc nhìn về lý do GPU được sử dụng rộng rãi và cách nó hoạt động.
Ý kiến của GN⁺
- GPU là công nghệ thiết yếu cho deep learning và các phép tính số phức tạp; bài viết này giúp hiểu kiến trúc cơ bản và mô hình thực thi của GPU.
- Nội dung này đặc biệt quan trọng với các kỹ sư phần mềm mới bắt đầu quan tâm đến xử lý song song và tính toán hiệu năng cao.
- Bài viết cung cấp kiến thức nền tảng về lập trình GPU và là tài liệu thú vị khơi gợi sự tò mò về lĩnh vực này.
1 bình luận
Ý kiến trên Hacker News