2 điểm bởi GN⁺ 2024-04-27 | 1 bình luận | Chia sẻ qua WhatsApp

Tổng quan kiến trúc tiny-gpu

GPU

  • Được xây dựng để chạy một kernel tại một thời điểm
  • Để chạy kernel, cần thực hiện các bước sau:
    1. Nạp bộ nhớ chương trình toàn cục bằng mã kernel
    2. Nạp bộ nhớ dữ liệu bằng dữ liệu cần thiết
    3. Chỉ định số luồng sẽ chạy trong thanh ghi điều khiển thiết bị
    4. Đặt tín hiệu bắt đầu thành HIGH để chạy kernel
  • GPU gồm các đơn vị sau:
    1. Thanh ghi điều khiển thiết bị
    2. Bộ điều phối
    3. Số lượng lõi tính toán có thể thay đổi
    4. Bộ điều khiển bộ nhớ cho bộ nhớ dữ liệu và bộ nhớ chương trình
    5. Bộ nhớ đệm

Bộ nhớ

  • GPU được xây dựng để giao tiếp với bộ nhớ toàn cục bên ngoài
  • Bộ nhớ dữ liệu và bộ nhớ chương trình được tách riêng để đơn giản hóa
  • Bộ nhớ toàn cục có băng thông đọc/ghi cố định
  • Bộ điều khiển bộ nhớ theo dõi mọi yêu cầu đi ra từ các lõi tính toán tới bộ nhớ, điều tiết các yêu cầu theo băng thông bộ nhớ ngoài thực tế, và chuyển tiếp phản hồi từ bộ nhớ ngoài tới tài nguyên phù hợp
  • Bộ nhớ đệm lưu dữ liệu được yêu cầu lặp lại để giảm mức sử dụng băng thông bộ nhớ

Lõi

  • Mỗi lõi có tài nguyên tính toán riêng
  • Trong GPU đơn giản hóa này, mỗi lõi xử lý một block tại một thời điểm, và có ALU, LSU, PC cùng tệp thanh ghi chuyên dụng cho từng luồng trong block
  • Bộ lập lịch quản lý việc thực thi luồng và không chọn block mới trước khi hoàn thành block hiện tại
  • Bộ nạp lệnh lấy lệnh một cách bất đồng bộ từ bộ đếm chương trình hiện tại
  • Bộ giải mã giải mã lệnh đã nạp thành các tín hiệu điều khiển để thực thi luồng
  • Mỗi luồng có một tập tệp thanh ghi chuyên dụng
  • ALU là đơn vị số học logic chuyên dụng cho từng luồng
  • LSU là đơn vị load-store chuyên dụng cho từng luồng để truy cập bộ nhớ dữ liệu toàn cục
  • PC là bộ đếm chương trình chuyên dụng quyết định lệnh tiếp theo sẽ được thực thi trong từng luồng

ISA

  • Triển khai ISA đơn giản gồm 11 lệnh
  • Được xây dựng cho các kernel đơn giản như cộng và nhân ma trận
  • Hỗ trợ các phép toán số học cơ bản, load/store bộ nhớ, rẽ nhánh, nạp hằng số, v.v.

Thực thi

  • Mỗi lõi đi qua các giai đoạn fetch, decode, request, wait, execute và update để thực thi lệnh
  • Mỗi luồng đi theo đường thực thi để thực hiện tính toán trên dữ liệu trong tệp thanh ghi
  • Để hỗ trợ SIMD, các thanh ghi chỉ đọc chứa giá trị chỉ số block, kích thước và chỉ số luồng

Kernel

  • Các kernel cộng và nhân ma trận được viết bằng ISA để chứng minh lập trình SIMD và việc thực thi trên GPU
  • Có thể mô phỏng đầy đủ việc chạy kernel trên GPU bằng tệp kiểm thử và tạo trạng thái bộ nhớ dữ liệu cùng dấu vết thực thi

Mô phỏng

  • Sau khi cài đặt iverilogcocotb, có thể chạy mô phỏng kernel bằng lệnh make
  • Tệp log sẽ in ra trạng thái bộ nhớ dữ liệu ban đầu/cuối cùng và dấu vết thực thi đầy đủ của kernel

Tính năng nâng cao

  • Nhiều tính năng bổ sung của GPU hiện đại giúp cải thiện đáng kể hiệu năng và chức năng đã được lược bỏ để đơn giản hóa
  • Có thảo luận về các tính năng như cache nhiều tầng và bộ nhớ chia sẻ, gộp truy cập bộ nhớ, pipelining, lập lịch Warp, phân kỳ nhánh, đồng bộ hóa và barrier

Ý kiến của GN⁺

  • Dự án giải thích rất tốt các khái niệm cốt lõi của kiến trúc GPU và mô hình lập trình SIMD theo cách đơn giản, dễ hiểu. Đặc biệt, ví dụ kernel phép toán ma trận cho thấy rõ cách xử lý song song diễn ra trên GPU thực tế.
  • Các tính năng nâng cao được dùng trong GPU hiện đại cũng được tổng hợp tốt, nên sau khi hiểu tiny-gpu, tài liệu này sẽ hữu ích để học các kiến trúc GPU phức tạp hơn.
  • Tuy vậy, do không có các chức năng của pipeline đồ họa thực tế, nên tài liệu không đề cập tới cách phần cứng chuyên cho đồ họa vận hành. Điều này có thể khiến những người quan tâm tới đồ họa thấy thiếu hụt.
  • Nếu so sánh với các kiến trúc GPU mã nguồn mở khác như MIAOW hoặc GPGPU-Sim, tài liệu sẽ càng hữu ích hơn để hiểu các GPU thực tế hơn.
  • Nếu sau này bổ sung các tính năng như phân kỳ nhánh, gộp truy cập bộ nhớ và pipelining, đây sẽ trở thành tài liệu học tập thực tiễn hơn nữa. Việc đây cũng là một dự án mã nguồn mở có thể đóng góp phát triển là một điểm hấp dẫn.

1 bình luận

 
GN⁺ 2024-04-27
Ý kiến trên Hacker News
  • Intel đã công khai khá nhiều tài liệu kỹ thuật về GPU. Có thể tìm thấy cả tài liệu hướng dẫn cho 810/815 trên mạng. Ngoại trừ 855/910/915/945, việc tài liệu hóa nhìn chung khá nhất quán.

  • Ủng hộ và khuyến khích các dự án GPU open core.

  • Có một dự án GPU mã nguồn mở khác tên là NyuziProcessor. (https://github.com/jbush001/NyuziProcessor)

  • Muốn bắt đầu với FPGA nhưng khó xác định nên bắt đầu từ đâu, và bản thân lĩnh vực này tạo cảm giác khá đáng ngại.

  • Mục tiêu cuối cùng là tạo một card tăng tốc cho LLM (Large Language Model). Ngoài phần offload bộ nhớ ra thì sẽ có khá nhiều điểm tương đồng với dự án này.

  • Đặt câu hỏi về lý do trộn toán tử gán non-blocking và blocking trong các khối always tuần tự.

  • Trước đây đã từng làm việc tương tự bằng VHDL. Có một trang tên là opencores với nhiều dự án HDL mã nguồn mở. Tò mò không biết ngày nay có trình mô phỏng HDL phân tán quy mô lớn ở mức HPC hay không. Việc dùng GPU hiện đại để chạy mô phỏng ở mức RTL nghe có vẻ hợp lý.

  • Thích việc các dự án phần cứng được mở ra công khai. Nhưng cái này có thể được xem là một bộ đồng xử lý SIMD. Để thực sự là GPU thì ít nhất cũng nên có một dạng đầu ra hiển thị nào đó. Gần đây Nvidia và các hãng khác bán các biến thể chỉ dành cho máy chủ của kiến trúc đồ họa như GPU, nên thuật ngữ này có phần bị nới lỏng, nhưng phần “graphics” trong thiết kế GPU vẫn chiếm phần lớn độ phức tạp.

  • Thắc mắc liệu việc ALU trực tiếp triển khai lệnh DIV ở mức phần cứng có phổ biến hay không. Không rõ trên các CUDA core hiện đại chẳng hạn thì đó có thực sự là lệnh phần cứng hay thường chỉ là giả lập bằng phần mềm. Mạch chia trong phần cứng chiếm khá nhiều diện tích nên không nghĩ nó thường có trong ALU của GPU. Trong Verilog thì viết DIV: begin alu_out_reg <= rs / rt; end rất dễ, nhưng trên silicon thì nó tốn nhiều diện tích. Người chỉ mô phỏng Verilog có thể không nhận ra điều này.

  • Lại thêm một “GPU” khác không cung cấp chức năng đồ họa. Theo ý kiến này thì những thứ như vậy nên được gọi bằng tên khác.

  • Đã đơn giản hóa theo giả định rằng các luồng được xử lý song song và sau mỗi lệnh thì mọi luồng đều “hội tụ” về cùng một bộ đếm chương trình. Trên GPU thực tế, từng luồng có thể rẽ nhánh sang PC khác nhau, dẫn đến branch divergence. Có lẽ nên thử lập trình GPU trước khi làm GPU bằng silicon. Cái này cũng không hẳn là SIMD. (Cùng người từng lắp một mạch nhấp nháy LED rồi tuyên bố mình đã tạo ra CPU)