Loop unrolling là gì?

Loop unrolling là gì? Có bao giờ bạn đã nghe khái niệm này chưa? Nếu chưa hãy cùng nhau tìm hiểu nhé.

TỔNG QUAN

Về cơ bản loop unrolling là một kỹ thuật biến đổi vòng lặp (for, while..) để cho tốc độ thực thi của chương trình được tối ưu nhất. Để đạt được điều này, người ta thường thêm vô những đoạn code trong vòng lặp để giảm thiểu số vòng lặp. Loop unrolling cõ lẽ là một trong những kỹ thuật lâu đời nhất và được biết đến nhiều nhất trong các kỹ thuật Loop transformation/Loop optimization 

Chúng ta cùng tham khảo một ví dụ nhỏ dưới đây để dễ hình dung hơn

Normal loop After loop unrolling

Các bạn thấy đấy với một chút điều chỉnh, vòng lặp mới chỉ mất 20 lần để thực thi, còn vòng lặp cũ mất 100 lần, có nghĩa là chúng ta đã tăng tốc độ vòng lặp lên được 5 lần.

LỢI ÍCH

  • Giảm thiểu số lần lặp => tốc độ thực thi của chương trình tốt hơn
  • Nếu như những câu lệnh trong vòng lặp không phụ thuộc vào nhau, chúng có thể được thực hiện một cách song song. Ví dụ như đoạn code trên, nếu như những câu lệnh delete không phụ thuộc vô nhau, chúng ta có thể tạo ra 5 thread cho việc delete, về mặt lý thuyết chúng ta có thể delete một lúc 5 phần tử => tốc độ thực thi của chương trình lại được giảm đi 5 lần

HẠN CHẾ

  • Việc chúng ta thêm những đoạn code trong vòng lặp để giảm thiểu số lượng vòng lặp như thế đồng nghĩa với việc size của chương trình đó cũng tăng lên. Với những chương trình chạy trên các thiết bị có ít resource như embedded thì điều này cũng cần phải lưu tâm
    • Lấy ví dụ bên trên. Giả sử hàm delete là inline function, và hàm này có 5 dòng code. Số lượng dòng code lúc này không phải tăng lên 5 lần nữa mà 5*5 = 25 lần.
  • Có khả năng làm tăng sự sử dụng của register lên: dùng để lưu trữ những biến tạm cho một vòng lặp

ỨNG DỤNG THỰC TẾ

Với những lợi ích cũng như hạn chế như trên thì giờ đây mỗi lần viết một đoạn code để loop chúng ta có nên phải vắt óc suy nghĩ lợi và hại của nó không? Kiểu như: vòng lặp của mình đã tối ưu chưa? Mình có nên unrolling nó không? Nếu như unrolling xong rồi nó còn chậm hơn thì sao? Lỡ như mình không tôi ưu rồi chương trình vì vòng loop mình chạy chậm thì sao? Sếp sẽ chửi mình sao? Mình sẽ giảm KPI sao? Mình là coder tồi sao? Mình không phù hợp cho công việc này sao? Cuộc đời mình sẽ trôi về đâu!?….STOP!

Thật ra áp lực về thời gian thì bạn cũng chả thể nào mà ngồi đó nghĩ ngợi được gì nhiều lắm, nó chạy là tốt lắm dzồi!!!

Tuy nhiên, có một điều đáng mừng là với những compiler hiện đại và thông mình như hiện nay, chúng thường có xu hướng tự động tối ưu hoá vòng lặp cho dev (hên ha!) nên chúng ta không cần phải suy nghĩ nhiều lắm về cuộc đời này đâu.