- Định luật Moore đang chạm tới giới hạn, khiến phần cứng chuyển từ tăng tốc đơn lõi sang tập trung vào đa lõi và xử lý song song
- Xử lý song song được chia thành nhiều dạng như song song dữ liệu, song song mô hình và song song pipeline, và được dùng kết hợp trong các hệ thống deep learning hiện đại
- Việc song song hóa diễn ra ở nhiều tầng khác nhau như SIMD (song song dữ liệu ở mức lệnh), song song luồng/lõi, và song song quy mô lớn trên GPU
- Ngôn ngữ, thư viện và công cụ cho xử lý song song phần lớn là các phần mở rộng 'gắn thêm' lên ngôn ngữ tuần tự hiện có, nên xu hướng tích hợp song song như một năng lực native của ngôn ngữ (như Mojo) đang thu hút chú ý
- Những bài toán tối ưu hiệu năng thực tế như tối ưu chia sẻ cache line (tương tác không cần thiết), phân vùng bộ nhớ hiệu quả, và tự động vector hóa là các thách thức quan trọng
Động lực của tính song song và sự tiến hóa của phần cứng
- Ban đầu, hiệu năng được cải thiện tự nhiên nhờ thu nhỏ transistor và tăng xung nhịp, nhưng đã chạm tới giới hạn vật lý do nhiệt lượng/quy trình sản xuất
- Sau đó, kiến trúc đa lõi trở thành tiêu chuẩn, với một CPU tích hợp từ vài đến hàng trăm lõi
Các dạng song song phổ biến
- Song song dữ liệu: áp dụng cùng một phép toán đồng thời lên nhiều dữ liệu (ví dụ: phép cộng vector)
- Song song mô hình: phân tán một mô hình trên nhiều thiết bị
- Song song pipeline: chia phép tính thành nhiều giai đoạn, để mỗi giai đoạn hoạt động đồng thời
SIMD (một lệnh, nhiều dữ liệu) và vector hóa
- SIMD là cách xử lý nhiều phần tử dữ liệu (vector) chỉ bằng một lệnh, được hỗ trợ trong nhiều ISA như ARM NEON, x86 SSE/AVX
- Có thể điều khiển tường minh các phép toán vector thông qua intrinsics C/C++; compiler cũng hỗ trợ tự động vector hóa nhưng vẫn có giới hạn
- Trong thực tế, thường lặp xử lý theo độ dài vector trước, rồi phần dữ liệu còn lại được hiệu chỉnh bằng phép toán vô hướng
Song song hóa trên CPU
- Tận dụng thread để thực thi song song trên hệ đa lõi, với API theo từng ngôn ngữ và sự hỗ trợ từ bộ lập lịch của OS
- Vì chi phí tạo/hủy thread khá lớn, việc chia việc với số lượng thread phù hợp với kích thước dữ liệu (gần với số lõi) sẽ hiệu quả hơn
- Việc tối ưu cache line 'false sharing' (hiệu năng giảm khi các thread khác nhau truy cập các biến độc lập nhưng nằm cùng một cache line) là rất quan trọng; có thể dùng
std::hardware_destructive_interference_size của C++17
- Cần xử lý padding/căn chỉnh để mỗi thread ghi vào vùng dữ liệu riêng biệt
Song song hóa trên GPU
- GPU được tối ưu cho xử lý song song dữ liệu quy mô lớn nhờ hàng nghìn lõi nhỏ
- CUDA/OpenCL: chạy hàm kernel theo đơn vị từ hàng chục đến hàng chục nghìn thread/block; bên trong là mô hình SIMT (một lệnh, nhiều luồng)
- Cơ chế hoạt động theo đơn vị work group/warp, và việc giảm thiểu phân nhánh khác biệt (branch divergence) có ý nghĩa cực lớn đối với hiệu năng
- Cấu trúc phân tầng bộ nhớ: cần tối ưu theo tầng giữa thanh ghi của thread, bộ nhớ chia sẻ của block, và bộ nhớ global toàn cục
Triton: DSL kernel GPU dựa trên Python
- Triton là một DSL nhúng trong Python, hỗ trợ biên dịch JIT và nhiều backend (MLIR/LLVM/PTX, v.v.)
- Có thể viết mã kernel bằng Python cấp cao, đồng thời được hỗ trợ tự động song song hóa, phân chia và masking
- Đạt khoảng 75~90% hiệu năng so với NVIDIA cuDNN, trong khi độ phức tạp phát triển giảm mạnh
Biến tính song song thành năng lực native của ngôn ngữ: Mojo
- Mojo là ngôn ngữ mới do Chris Lattner, nhà phát triển LLVM/MLIR, tạo ra, hỗ trợ song song hóa và biên dịch tối ưu cho phần cứng ngay ở cấp độ ngôn ngữ
- Các yếu tố như kiểu vector SIMD, hàm vector hóa, phân biệt bộ nhớ host/device đều cho thấy tính song song được tích hợp ngay trong hệ kiểu và cấu trúc ngôn ngữ
- Ngay cả các vòng lặp kiểu Python cũng có thể được tự động vector hóa, giúp đạt hiệu năng mà không cần kiểm soát tường minh ở mức thấp
Kết luận và triển vọng
- Lập trình song song hiện đại được hình thành từ sự kết hợp của nhiều loại phần cứng và mô hình song song khác nhau, và sự hỗ trợ từ chính ngôn ngữ ngày càng trở nên quan trọng
- Với sự nổi lên của các ngôn ngữ và công cụ song song thế hệ mới như Mojo, Triton và JAX, việc song song hóa đang trở nên trực quan và hiệu quả hơn về mặt năng suất
- Lập trình song song chỉ có thể tối đa hóa hiệu năng thực tế khi cấu trúc phần cứng, tối ưu bộ nhớ và sự hỗ trợ của ngôn ngữ được kết hợp chặt chẽ với nhau
Chưa có bình luận nào.