- Bài viết này bàn về một triển khai tìm kiếm nhị phân C++ tổng quát ngắn gọn hơn và nhanh gấp đôi so với hàm chuẩn
std::lower_bound.
- Triển khai mới là "không nhánh" vì nó được biên dịch thành các lệnh di chuyển có điều kiện thay vì phân nhánh/nhảy có điều kiện.
- Tìm kiếm nhị phân hoạt động bằng cách chia một danh sách đã sắp xếp thành hai phần tại phần tử giữa, rồi so sánh giá trị ở giữa với giá trị cho trước. Dựa trên kết quả so sánh, nó quyết định sẽ tiếp tục tìm trong phần nào của hai phần đó.
- Bài viết cũng thảo luận về khái niệm dự đoán nhánh, một kỹ thuật mà bộ xử lý dùng để thực thi lệnh song song nhằm tăng tốc. Tuy nhiên, vì tìm kiếm nhị phân khó dự đoán nên dự đoán nhánh không phải là lựa chọn lý tưởng.
- Tác giả giới thiệu một triển khai tìm kiếm nhị phân mới,
sb_lower_bound, nhanh hơn cả triển khai chuẩn lẫn phiên bản branchless_lower_bound. Nó nhanh hơn vì có ít lệnh hơn đáng kể bên trong vòng lặp.
- Tác giả cũng đưa ra một phiên bản nhanh hơn nữa,
bb_lower_bound, sử dụng một cách khác để chia danh sách tìm kiếm.
- Bài viết kết thúc bằng gợi ý rằng nếu phần chậm nhất của chương trình có chứa thao tác tìm kiếm và/hoặc so sánh mà bộ xử lý không thể dự đoán, hãy thử dùng clang với
-mllvm -x86-cmov-converter=false. Nếu cần tìm kiếm nhị phân nhanh hơn, hãy thử sb_lower_bound.
- Tác giả cũng cung cấp mã cho các triển khai tìm kiếm nhị phân mới và thảo luận chi tiết về hiệu năng của từng phiên bản.
- Bài viết đã được cập nhật với một phiên bản tái cấu trúc của
sb_lower_bound giúp giảm số lệnh assembly trong vòng lặp nóng từ 9 xuống 8, nhờ đó cải thiện tốc độ đôi chút.
- Tác giả cũng thảo luận về khái niệm prefetching, tức là đưa trước một phần bộ nhớ cụ thể vào cache để khi dữ liệu được prefetch thực sự cần đến thì chỉ còn độ trễ của cache L1/L2. Một phiên bản
sb_lower_bound có thêm prefetching cho 256KB+ cũng được cung cấp.
- Bài viết do Mihail Dumitrescu viết và được xuất bản vào ngày 24 tháng 6 năm 2023.
1 bình luận
Ý kiến trên Hacker News
lowerBound.sb_lower_boundcho các kiểu cơ bản vàstd::lower_boundcho các trường hợp khác.