Tối Ưu Hóa Achieved Occupancy Trong GPU - Phần 2
Trong phần 1 của bài viết, mình đã giới thiệu về khái niệm occupancy, và trong phần 2 này, chúng ta sẽ tìm hiểu sâu hơn về đạt được achieved occupancy, cũng như cách cải thiện hiệu suất thực thi của GPU.
Giải Thích Một Số Khái Niệm Quan Trọng
Trước khi đi vào chi tiết về achieved occupancy, hãy cùng tìm hiểu một số khái niệm quan trọng cần nắm rõ:
- Tail Effect: Khi tổng số thread không chia hết cho kích thước của một warp (32), sẽ xuất hiện tail effect, tức là số thread còn lại trong warp không đủ để tận dụng hết khả năng tính toán. Ví dụ, với N = 80 và số thread là 40, ta cần 2 warp nhưng warp thứ 2 chỉ sử dụng 8 thread. Điều này gây lãng phí tài nguyên và làm giảm hiệu suất.
- Waves: Là thuật ngữ khác để chỉ warp.
Achieved Occupancy Là Gì?
Achieved occupancy đại diện cho số lượng warp thực tế hoạt động trên mỗi Streaming Multiprocessor (SM) trong GPU. Điều này phụ thuộc vào cách thực thi của các thread trong các khối (blocks) và tốc độ mà chúng kết thúc các tác vụ của mình. Do đó, đạt được achieved occupancy có thể không cao bằng theoretical occupancy, tức là giới hạn trên của số warp hoạt động tối đa.
Nguyên Nhân Khiến Achieved Occupancy Thấp
Để hiểu rõ hơn về achieved occupancy, chúng ta cần kiểm tra sự chênh lệch giữa achieved và theoretical occupancy. Nếu achieved occupancy thấp hơn theoretical, có thể do một số nguyên nhân sau:
-
Tải Công Việc Không Đồng Đều Trong Block: Khi các warp trong một block không thực hiện đồng thời, điều này có thể là do số lượng thread trong block quá lớn, dẫn đến việc một số warp bị stall. Thay vì sử dụng số lượng tối đa thread (1024 thread), hãy cân nhắc tối ưu hóa số thread phù hợp với dữ liệu.
-
Tải Công Việc Không Đồng Đều Giữa Các Block: Tương tự, nếu các block không hoạt động cùng một lúc trên mỗi SM, có thể do số lượng block quá lớn. Để khắc phục, có thể thay đổi số lượng block trong grid hoặc sử dụng streaming để chạy các kernel đồng thời.
-
Số Block Khởi Động Quá Ít: Nếu số block sử dụng ít hơn số SM có thể chạy cùng lúc, ta sẽ không đạt tối đa hiệu suất. Ví dụ, với 15 SM và theoretical occupancy 100%, nếu chỉ sử dụng 45 block thay vì 60 block, sẽ đạt được chỉ 75% achieved occupancy.
Lưu Ý Khi Tối Ưu Hóa Achieved Occupancy
Tuy nhiên, việc cải thiện occupancy không phải là điều cần thiết phải tập trung quá nhiều. Một achieved occupancy cao không đảm bảo rằng hiệu suất tính toán cũng cao. Mỗi thread có một số lượng register cố định, do đó nếu sử dụng quá nhiều thread có thể làm giảm khả năng tính toán.
Tóm Lại: Trước khi tìm cách nâng cao achieved occupancy, hãy xem xét độ phức tạp của thuật toán và khả năng tính toán của mỗi thread để xác định số lượng thread cần thiết.
Trong các bài viết tiếp theo, mình sẽ làm rõ hơn về cách xác định độ phức tạp của một tính toán để từ đó tối ưu hóa số lượng thread sử dụng trong GPU.
source: viblo