Mặc dù phiên bản hiệu quả công việc đòi hỏi nhiều bước hơn, nhưng điều này được bù đắp bởi thực tế là số lượng luồng hoạt động giảm nhanh hơn và tổng số luồng hoạt động trên tất cả các lần lặp lại nhỏ hơn đáng kể. Nếu một sợi dọc không có luồng hoạt động trong một lần lặp, thì sợi dọc đó sẽ bỏ qua hàng rào sau và bị treo, cho phép các sợi dọc khác chạy. Vì vậy, có ít sợi dọc hoạt động thường có thể trả hết trong thời gian thực hiện. . để duy trì hoạt động.)
Hãy xem xét số lượng các chủ đề hoạt động trong thuật toán ngây thơ. Nhìn vào hình 2 trong bài viết, bạn có thể thấy rằng tất cả các luồng đang hoạt động ngoại trừ 2 k đầu tiên trên lần lặp thứ k . Vì vậy, với N luồng, số lượng luồng hoạt động đi như N - 2 k . Ví dụ: với N = 1024, số lượng luồng hoạt động trên mỗi lần lặp là:
1023, 1022, 1020, 1016, 1008, 992, 960, 896, 768, 512
Nếu tôi chuyển đổi số này thành số lượng sợi dọc đang hoạt động (bằng cách chia cho 32 và làm tròn số), tôi nhận được:
32, 32, 32, 32, 32, 31, 30, 28, 24, 16
với tổng số là 288. Mặt khác, thuật toán hiệu quả công việc bắt đầu với một nửa số luồng, sau đó nó giảm một nửa số lượng hoạt động trên mỗi lần lặp cho đến khi giảm xuống 1, sau đó bắt đầu nhân đôi cho đến khi nó trở lại một nửa kích thước mảng một lần nữa:
512, 256, 128, 64, 32, 16, 8, 4, 2, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512
Chuyển đổi này thành warps hoạt động:
16, 8, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 8, 16
Tổng số là 71, chỉ bằng một phần tư. Vì vậy, bạn có thể thấy rằng trong toàn bộ hoạt động, số lượng sợi dọc hoạt động nhỏ hơn nhiều với thuật toán hiệu quả công việc. (Trên thực tế, đối với một lần chạy dài ở giữa, chỉ có một số ít các sợi dọc hoạt động, có nghĩa là hầu hết các chip không bị chiếm giữ. Nếu có các tác vụ tính toán bổ sung đang chạy, ví dụ từ các luồng CUDA khác, chúng có thể mở rộng để lấp đầy nó không gian trống