Tại sao hiệu quả công việc mong muốn trong lập trình GPU?


13

Tôi đã đọc bài viết sau về cách thực hiện quét song song trong CUDA:

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch39.html

Trong bài viết, có một sự nhấn mạnh vào việc làm cho quá trình quét "hoạt động hiệu quả". Nói cách khác, thuật toán GPU sẽ không thực hiện nhiều bổ sung hơn thuật toán CPU, O (n). Các tác giả trình bày hai thuật toán, một thuật toán "ngây thơ" bổ sung O (nlogn) và một thuật toán mà họ cho là "làm việc hiệu quả". Tuy nhiên, thuật toán hiệu quả công việc thực hiện gấp đôi số lần lặp.

Theo hiểu biết của tôi, GPU chỉ đơn giản là bộ xử lý SIMD khổng lồ và nên hoạt động theo từng bước. Thực hiện gấp đôi số vòng lặp trong thuật toán "hiệu quả công việc" dường như ngụ ý rằng nhiều luồng sẽ không hoạt động và giảm hiệu suất trong thời gian dài. Tôi đang thiếu gì?

Câu trả lời:


21

Trước hết, re: "GPU chỉ đơn giản là bộ xử lý SIMD khổng lồ và nên hoạt động theo bước khóa", nó phức tạp hơn thế một chút. Các toàn bộ GPU không chạy theo sát bước chân. Các chuỗi shader được tổ chức thành các nhóm 32 được gọi là "warps" (trên NVIDIA; trên AMD là các nhóm 64 được gọi là "wavefronts", nhưng cùng một khái niệm). Trong một sợi dọc, tất cả các luồng chạy trong bước khóa dưới dạng một mảng SIMD. Tuy nhiên, các sợi dọc khác nhau không ở trong tình trạng khóa với nhau. Ngoài ra, một số sợi dọc có thể đang hoạt động tích cực trong khi một số khác có thể bị treo, giống như các luồng CPU. Warps có thể bị đình chỉ vì họ đang chờ đợi một cái gì đó (chẳng hạn như các giao dịch bộ nhớ trở lại hoặc các rào cản bị xóa) hoặc vì không có '

Bây giờ, trở lại câu hỏi của bạn. Tôi có thể thấy hai cách mà thuật toán "hiệu quả công việc" từ bài báo đó có vẻ như nó sẽ hiệu quả hơn thuật toán "ngây thơ".

  1. Phiên bản hiệu quả công việc đòi hỏi một nửa số chủ đề để bắt đầu. Trong thuật toán ngây thơ, chúng có một luồng trên mỗi phần tử mảng; nhưng trong phiên bản hiệu quả công việc, mỗi luồng hoạt động trên hai phần tử liền kề của mảng và do đó chúng chỉ cần một nửa số luồng như các phần tử mảng. Ít chủ đề hơn có nghĩa là ít sợi dọc hơn, và do đó một phần lớn các sợi dọc có thể được tích cực chạy.

  2. 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

Tất cả những gì đã nói, thật không may là bài viết về GPU Gems không giải thích rõ ràng về điều này, thay vào đó tập trung vào phân tích "số lượng bổ sung" lớn, trong khi không hoàn toàn không liên quan, lại bỏ lỡ rất nhiều chi tiết về lý do tại sao thuật toán này nhanh hơn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.