Phân Tích Tình Trạng Bị Giới Hạn Bộ Nhớ Thông Qua Roofline Chart
Trong bài viết trước, chúng ta đã sử dụng SoL để xác định liệu mã nguồn của chúng ta có gặp phải tình trạng memory/compute bound hay không. Trong bài viết này, mình sẽ hướng dẫn các bạn một phương pháp khác hiệu quả hơn để xác định tình trạng này, đó là roofline chart.
Roofline Chart Là Gì?
Roofline chart là một đồ thị dùng để phân tích hiệu suất của mã nguồn, giúp xác định liệu một đoạn mã đang bị giới hạn bởi bộ nhớ hay khả năng tính toán. Trước khi tìm hiểu sâu hơn về roofline chart, chúng ta cần hiểu một số khái niệm cơ bản:
Định Nghĩa Quan Trọng:
- Arithmetic Intensity (AI) - Tỉ lệ Tính Toán (FLOP/byte): Đây là một chỉ số thể hiện mức độ sử dụng hiệu quả của tài nguyên tính toán và băng thông bộ nhớ. Từ đó, chúng ta có thể điều chỉnh sao cho phù hợp, nhằm tránh tình trạng memory/compute bound. Mỗi máy tính sẽ có sự khác biệt về tỉ lệ này.
- Peak FLOP/s: Tốc độ tính toán tối đa mà một máy tính có thể đạt được.
- Bandwidth GB/s: Tốc độ mà máy tính có thể tải hoặc lưu trữ dữ liệu. Điểm giao nhau giữa đường màu đỏ (tốc độ tính toán) và đường màu xanh (băng thông bộ nhớ) được gọi là key point hay knee point.
Key Point (Knee Point)
Key point là điểm chuyển giao giữa hai giai đoạn:
- Giai đoạn đầu bị memory bound: Tại đây, hiệu suất chịu ảnh hưởng nhiều bởi tốc độ truy cập bộ nhớ.
- Giai đoạn tiếp theo bị compute bound: Hiệu suất chủ yếu bị hạn chế bởi khả năng tính toán của máy.
Về lý thuyết, nếu mã nguồn của bạn đạt được tỉ lệ key point (ví dụ: AI = 0.55), điều đó có nghĩa là mã của bạn đã đạt được sự cân bằng tốt giữa phép toán và bộ nhớ.
Về thực tế, việc mà đoạn mã nằm trên đường chéo trong đồ thị roofline là một dấu hiệu tích cực và mong muốn.
Xác Định Bottleneck Trong Hiệu Suất
Có hai cách để xác định bottleneck trong hiệu suất:
- P (FLOP/s): Tốc độ tác vụ có thể thực hiện.
- P (peak): Tốc độ lý thuyết tối đa mà máy tính có thể đạt được.
- I . b (flop/byte * byte/s): Tốc độ thực tế để chạy đoạn mã đó.
Khi áp dụng min để xác định trạng thái compute hay memory bound:
- Nếu P(peak) min > I.b: Điều này cho thấy là mã của bạn bị compute bound. Bởi vì tốc độ thực tế cao hơn nhưng máy tính chỉ có thể tính toán tới mức peak, không thể vượt hơn. Giải pháp: Sử dụng kích thước đơn vị lớn hơn.
- Nếu I.b min > P(peak): Trường hợp này cho thấy mã của bạn đang bị memory bound. Chúng ta chưa tận dụng hết khả năng của máy tính. Giải pháp: Sử dụng kỹ thuật coarsening để cải thiện.
Kết Luận
Qua hai phần phân tích trên, chúng ta có thể xác định liệu đoạn mã của mình gặp phải vấn đề trong việc tính toán hay trong quá trình tải/lưu dữ liệu. Trong các bài viết tiếp theo, mình sẽ hướng dẫn cụ thể cách khắc phục từng trường hợp này.
source: viblo