Hiệu Năng Trong Lập Trình: Khái Niệm Compute và Memory
Khi nói về hiệu năng trong lập trình, có hai khái niệm chủ chốt mà chúng ta cần xem xét: memory và compute.
Định Nghĩa Computer và Memory
- Compute (khả năng tính toán) được đánh giá thông qua chỉ số FLOPS rate - đơn vị đo lường hiệu năng máy tính trong việc thực hiện các phép toán số thực động (dấu chấm động) trong 1 giây.
FLOPS rate: floating point operations per second
- Memory trong ngữ cảnh này không chỉ là lượng bộ nhớ mà là memory bandwidth - tốc độ mà dữ liệu được load/store giữa bộ nhớ và các thành phần xử lý.
Memory Bandwidth: bytes per second
Tại Sao Lại Cần Đánh Giá Tỷ Lệ Compute và Memory?
Desired compute to memory ratio (OP/B) là thước đo quan trọng để xác định sự cân bằng giữa khả năng xử lý của máy tính và khả năng load/store trong bộ nhớ.
Tại sao phải đảm bảo cân bằng?
Điều này là cần thiết để đảm bảo rằng tài nguyên phần cứng được sử dụng một cách hiệu quả nhất, tránh tình trạng bottleneck.
- OP/B Tỉ lệ Thấp: Máy tính đang thực hiện tác vụ nặng nhưng khả năng tính toán không đủ đáp ứng ==> tình trạng compute bound (hạn chế về khả năng tính toán).
- OP/B Tỉ lệ Cao: Không đủ dữ liệu (data starvation) cung cấp cho máy tính xử lý ==> tình trạng memory bound (hạn chế về khả năng load/store memory).
Compute Bound và Memory Bound
Compute Bound
- Compute bound xảy ra khi hiệu năng máy tính bị giới hạn bởi khả năng tính toán có thể thực hiện được. Tình trạng này thường xuất hiện khi thực hiện nhiều phép toán phức tạp.
Memory Bound
- Memory bound xảy ra khi hiệu năng bị giới hạn bởi khả năng truy cập dữ liệu từ bộ nhớ. Tình trạng này thường xảy ra khi load/store một lượng lớn dữ liệu.
Cách Xác Định Code Bị Compute/Memort Bound
Sử Dụng Speed Of Light Throughput (SoL)
Trong Nsight Compute, chúng ta có thể xác định liệu code của mình có đang gặp tình trạng Compute/Memory bound hay không bằng cách sử dụng SoL.
SoL giúp thể hiện mức độ hoạt động của máy tính (không phải hiệu suất mã nguồn). Mục tiêu của chúng ta là đạt được sự cân bằng giữa compute và memory.
Phân Tích Từng Trường Hợp:
- Latency (M & SM < 60): Khi giá trị M và SM đều dưới 60, chứng tỏ cả hai chưa được sử dụng với hiệu suất tối đa.
- Compute bound (SM > 60 || M < 60): Chúng ta có khả năng xử lý dữ liệu (M < 60) nhưng lại sử dụng quá nhiều tài nguyên cho tính toán (SM > 60).
- Memory bound (SM < 60 || M > 60): Việc load/store cần hiệu suất lớn trong khi tính toán lại đơn giản, dẫn đến data starvation.
- Compute/Memory bound (SM & M > 60): Có thể đoạn code đã tối ưu hoặc gặp các tình huống trên.
Các Chỉ Số Quan Trọng
- SM: Inst Executed Pipe Lsu(%): Nếu tỷ lệ này cao, có nghĩa là SM đang dành quá nhiều thời gian để load/store thay vì tính toán.
- SM: Pipe Fma/Alu Cycles Active (%): Phản ánh tỷ lệ phần trăm SM đang thực hiện phép toán.
Phân tích cẩn thận các chỉ số này sẽ giúp chúng ta xác định vấn đề trong code, từ đó tìm cách cải thiện hiệu suất.
source: viblo