Ở bài này mình sẽ giới thiệu sơ lược Nsight Systems - Nsight Compute để các bạn có 1 cái nhìn tổng quát nên sử dụng công cụ nào cho phù hợp với nhu cầu của mình
Xin lưu ý là bài viết này chỉ là giới thiệu sơ qua về 2 công cụ này chứ sẽ không đi sâu vào từng vấn đề 1, nên nội dung dưới đây chỉ là nói qua các thứ chúng ta cần để ý và chú tâm, còn việc giải thích cũng như debug/optimize sẽ là ở những bài sau này
Nsight Systems - Nsight Compute
Trước khi đi qua 2 công cụ này thì mình sẽ lấy 1 ví dụ để các bạn dễ hình dung hơn: Khi các bạn đi khám bác sĩ để kiểm tra sức khỏe định kì thì chúng ta sẽ khám tổng quát đầu tiên và nếu ổn thì thôi còn nếu thấy có vấn đề ( ví như tim, phổi, ... ) thì chúng ta sẽ khám kĩ hơn ở các phần chúng ta thấy không ổn ( như ở đây là tim, phổi, .. ). Thì ở đây performance code của chúng ta giống như sức khỏe vậy, đầu tiên chúng ta sẽ dùng Nsight Systems để kiểm tra tổng thể xem code chúng ta có vấn đề ở phần nào không ( ở đây là các function hay là copy data có vấn đề ), nếu có thì chúng ta sẽ dùng Nsight Compute để xác định trong function/copy data bị vấn đề gì mà optimize cũng như debug.
Như trong hình các bạn có thể thấy là chúng ta sẽ xuất phát ở Nsight Systems ( kiểm tra tổng thể ) sau đó là tới Nsight compute ( kiểm tra chi tiết các kernel - hay còn gọi là function ở GPU ). Và lưu ý là mình sẽ không đi qua Nsight Graphics vì nó thuộc về lĩnh vực đồ họa - game nhưng đừng vì vậy mà thất vọng vì các thông số cũng khá giống như Nsight compute.
1 lưu ý là 2 công cụ Compute và Systems CHỈ DÙNG ĐƯỢC cho các chương trình sử dụng GPU để chạy nên đó là lý do tại sao ở series này mình chỉ hướng dẫn xem các chương trình được lập trình song song hoặc là các model trong Deep Learning. Để hiểu rõ hơn về outcome của series này thì bạn có thể đọc qua lời mở đầu
Nsight Systems
Như trong hình bạn có thể thấy Nsight Systems đầu tiên dùng để phân tích chương trình, vậy thì ở đây cụ thể là phân tích những thứ gì?
Thời gian/tốc độ/dung lượng khi chuyển data từ Host sang Device và ngược lại
Dựa vào 3 bức ảnh trên ta có thể thấy chúng ta có thể cải thiện việc copy từ Host về Device
Tiếp đến chúng ta có thể xem overview kernel của chúng ta ( kernel tên: mygemm)
Các thông số mà chúng ta sẽ cần tập trung để phân tích là: Grid/block/Theoretical occupancy
Tóm lại sau khi khám tổng quát thì chúng ta thấy có thể cải thiện code thêm ở 2 mục: copy data và kernel
Nsight Compute
Sau khi xác nhận là 2 vấn đề cần xử lí là copy data và kernel thì chúng ta sẽ dùng Nsight Compute để phân tích rõ hơn bị vấn đề gì.
Đầu tiên là ở "summary" sẽ cho chúng ta thấy chúng ta gặp vấn đề cụ thể ở đâu và cách giải quyết ( Ở đây mình sẽ không đi quá sâu mà chỉ giải thích sơ qua )
Như hình bạn có thể thấy chúng ta có thể cải thiện 3 mục, trong đó có 2 mục mà mình đã phân tích phía trên:
- Theoretical warps speedup 33,33% : bạn để ý sẽ thấy ở bức hình overview kernel ở mục Theoretical occupancy là 66,66% tức là chúng ta có thể cải thiện thêm nữa ( về lý thuyết có thể đạt 100% )
- DRAM Execessive Read Sectors: tức là việc chúng ta phân bổ, tổ chức memory chưa được tối ưu dẫn đến việc Read/Write có vần đề trong quá trình transfer data.
Tiếp đến là "Source" sẽ cho chúng ta thấy dòng code nào thực hiện công việc nặng nhất ( tốn nhiều thời gian/memory)
Tiếp đến là "Detail" cũng sẽ mục khó nhất cũng là nơi chứa nhiều thông tin cần phân tích nhất. Trong Detail sẽ chứa nhiều thông tin nhưng chúng ta sẽ để ý đến những thứ này:
-
GPU Speed of Light Throughput
-
Memory Workload Analysis và các thông số cực kì chết não
-
Scheduler Statistics
-
Occupancy
Tóm tắt
Qua bài viết này bạn có lẽ mường tượng được công dụng của Nsight Systems - Nsight Compute. Ở các bài sau mình sẽ đi chi tiết hơn.