5 điểm bởi GN⁺ 2023-10-22 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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

  1. Sao chép dữ liệu từ host sang device
  2. Lập lịch thread block lên SM
  3. Single Instruction Multiple Threads (SIMT) và warp
  4. Lập lịch warp và che giấu độ trễ
  5. 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

 
GN⁺ 2023-10-22
Ý kiến trên Hacker News
  • Bài viết này bị chỉ trích là quá chuyên biệt cho Nvidia nên đã bỏ qua các lựa chọn thay thế hợp lệ khác như Sycl, Sapphire Rapids và MI300 của AMD.
  • Có ý kiến cho rằng bài viết chưa đề cập đầy đủ đến sao chép bất đồng bộ để ngăn GPU rơi vào trạng thái nhàn rỗi trong lúc truyền dữ liệu.
  • Bài viết được khen là phần giới thiệu tốt về lập trình GPU, nhưng cũng có đề xuất rằng nên tìm hiểu thêm các kỹ thuật nâng cao hơn.
  • Một số độc giả đặt câu hỏi về độ chính xác của nhận định trong bài rằng định luật Little của lý thuyết hàng đợi có thể áp dụng cho GPU.
  • Phần giải thích về kiến trúc bộ nhớ của bài viết bị phê bình vì không đề cập rằng bộ nhớ đệm không đảm bảo tính nhất quán giữa các luồng.
  • Có đề xuất nên đổi tên GPU thành PPU (Parallel Processing Units) để phản ánh tốt hơn khả năng của chúng.
  • Bài viết được khen là một trong những phần giải thích tốt hơn về lập trình GPU và được khuyến nghị dùng cho mục đích cố vấn.
  • Lập trình SIMD được mô tả là "hoang dã", với các phép tính đơn giản áp dụng cho mọi pixel nhưng gặp khó khăn với các điều kiện rẽ nhánh.
  • Có câu hỏi được đặt ra về hiệu quả của việc dùng GPU cho một số tác vụ tính toán mảng cụ thể, có tính đến nhu cầu truyền dữ liệu sang GPU và lấy dữ liệu từ GPU về.