Tại sao tôi có thể chạy 23.000 luồng CUDA trên GPU GeForce GTX 480?


5

Ai đó đã nói với tôi rằng GPU GeForce GTX 480 có thể chạy đồng thời 23.000 luồng CUDA. Tuy nhiên, tôi bối rối về lý do tại sao.

Mỗi lõi của GPU này chứa 2 nhóm 16 đơn vị SIMD. Mỗi đơn vị SIMD có 8 ALU và bối cảnh hướng dẫn. Có 15 lõi trên GPU.

Do đó, GPU này không thể chỉ chạy 2 * 16 * 8 * 15 = 3840 luồng CUDA cùng một lúc?


Đồng thời như trong nghĩa đen chạy đồng thời, hoặc đồng thời xâu chuỗi / theo lịch trình?
Đột phá

đồng thời xâu chuỗi / theo lịch trình. Mỗi bối cảnh ALU / hướng dẫn chạy chủ đề riêng của tôi, tôi tin.
David Faux

Tôi tin rằng người đó đang sử dụng "chạy đồng thời" có nghĩa là từ quan điểm của CPU. Từ quan điểm của CPU, GPU đang chạy tất cả các luồng mà nó có thể hỗ trợ đồng thời trong phần cứng, vì bất kỳ bộ nào trong số chúng có thể tiến triển về phía trước.
David Schwartz

Câu trả lời:


5

Các lõi GPU có hiệu quả có thể chạy nhiều luồng cùng một lúc, do cách chúng chuyển đổi giữa các luồng để ẩn độ trễ . Trên thực tế, bạn cần chạy nhiều luồng trên mỗi lõi để sử dụng đầy đủ GPU của mình.

Một GPU là sâu sắc pipelined , có nghĩa là ngay cả khi hướng dẫn mới đang bắt đầu mỗi chu kỳ, mỗi hướng dẫn cá nhân có thể mất vài chu trình để chạy. Đôi khi, một lệnh phụ thuộc vào kết quả của một lệnh trước đó, vì vậy nó không thể bắt đầu (nhập đường ống) cho đến khi lệnh trước đó kết thúc (thoát khỏi đường ống). Hoặc nó có thể phụ thuộc vào dữ liệu từ RAM sẽ mất một vài chu kỳ để truy cập. Trên CPU, điều này sẽ dẫn đến một " gian hàng đường ống " (hoặc "bong bóng"), khiến một phần của đường ống không hoạt động trong một số chu kỳ, chỉ chờ lệnh mới bắt đầu. Đây là một sự lãng phí tài nguyên máy tính, nhưng nó có thể là không thể tránh khỏi.

Không giống như CPU, lõi GPU có thể chuyển đổi giữa các luồng rất nhanh - theo thứ tự một hoặc hai chu kỳ. Vì vậy, khi một luồng bị trì hoãn trong một vài chu kỳ vì lệnh tiếp theo của nó chưa thể bắt đầu, GPU chỉ có thể chuyển sang một số luồng khác và bắt đầu hướng dẫn tiếp theo của nó. Nếu luồng đó bị kẹt, GPU sẽ chuyển luồng một lần nữa, v.v. Các luồng bổ sung này đang thực hiện công việc hữu ích trong các giai đoạn đường ống có thể không hoạt động trong các chu kỳ đó, vì vậy nếu có đủ các luồng để lấp đầy các khoảng trống của nhau, GPU có thể hoạt động ở mọi giai đoạn đường ống trên mỗi chu kỳ. Độ trễ trong bất kỳ một chủ đề được ẩn bởi các chủ đề khác.

Đây là nguyên tắc tương tự làm nền tảng cho tính năng siêu phân luồng của Intel, làm cho một lõi đơn xuất hiện dưới dạng hai lõi logic. Trong trường hợp xấu nhất, các luồng chạy trên hai lõi đó sẽ cạnh tranh với nhau về tài nguyên phần cứng và mỗi luồng chạy ở tốc độ một nửa. Nhưng trong nhiều trường hợp, một luồng có thể sử dụng các tài nguyên mà người kia không thể - ALU không cần thiết vào lúc này, các giai đoạn đường ống sẽ không hoạt động do quầy hàng - để cả hai luồng chạy với tốc độ hơn 50% tốc độ họ sẽ đạt được nếu chạy một mình. Thiết kế của GPU về cơ bản mở rộng lợi ích này đến hơn hai luồng.

Bạn có thể thấy hữu ích khi đọc Hướng dẫn thực hành tốt nhất CUDA của NVIDIA , cụ thể là chương 10 ("Tối ưu hóa cấu hình thực thi"), cung cấp thông tin chi tiết hơn về cách sắp xếp các luồng của bạn để giữ cho GPU luôn bận rộn.


Ồ, cảm ơn bạn. Tại sao chuyển đổi ngữ cảnh trên CPU mất nhiều thời gian như vậy?
David Faux

@DavidFaux: quầy hàng đường ống, như đã giải thích ở trên. Ngoài ra, CPU có bộ nhớ cache lớn và bộ nhớ cache bị ô nhiễm bởi các chuyển đổi ngữ cảnh.
David Schwartz

@DavidFaux, CPU chỉ giữ trạng thái của một luồng tại một thời điểm (Siêu phân luồng sang một bên), do đó, một công tắc ngữ cảnh yêu cầu gọi trình lập lịch của HĐH để lưu trạng thái của luồng hiện tại (các thanh ghi, v.v.) và tải một luồng khác. Điều đó liên quan đến việc chạy rất nhiều hướng dẫn, và sẽ mất nhiều thời gian hơn là chỉ chờ đợi gian hàng đường ống. GPU theo dõi rất nhiều bối cảnh luồng, vì vậy phần cứng có thể chuyển đổi giữa chúng (theo kiểu vòng tròn đơn giản) mà không cần phải chạy bộ lập lịch.
Wyzard
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.