Tôi đã sử dụng CUDA trong một vài tuần, nhưng tôi có một số nghi ngờ về việc phân bổ khối/warps/thread. Tôi đang nghiên cứu kiến trúc theo quan điểm của giáo khoa (dự án đại học), vì vậy đạt hiệu suất cao nhất không phải là mối quan tâm của tôi.CUDA chặn/warps/luồng ánh xạ lên lõi CUDA như thế nào?
Trước hết, tôi muốn hiểu nếu tôi có những sự kiện thẳng:
Các lập trình viên viết một hạt nhân và tổ chức thực hiện của nó trong một mạng lưới các khối thread.
Mỗi khối được gán cho bộ xử lý đa luồng (SM). Sau khi được gán, nó không thể di chuyển sang một SM khác.
Mỗi SM chia khối riêng thành Warps (hiện có kích thước tối đa là 32 luồng). Tất cả các chủ đề trong một warp thực hiện đồng thời trên các nguồn lực của SM.
Việc thực thi thực tế luồng được thực hiện bởi các CUDA chứa trong SM. Không có ánh xạ cụ thể nào giữa các luồng và lõi.
Nếu một sợi dọc chứa 20 sợi, nhưng hiện tại chỉ có 16 lõi, sợi dọc sẽ không chạy.
Mặt khác, nếu một khối chứa 48 chủ đề, nó sẽ được chia thành 2 warps và chúng sẽ thực thi song song với điều kiện là đủ bộ nhớ.
Nếu chuỗi bắt đầu trên lõi, sau đó nó bị ngừng truy cập bộ nhớ hoặc cho hoạt động điểm nổi dài, quá trình thực thi có thể tiếp tục trên một lõi khác.
Chúng có chính xác không?
Bây giờ, tôi có GeForce 560 Ti theo thông số kỹ thuật được trang bị 8 SM, mỗi bộ chứa 48 lõi CUDA (tổng cộng 384 lõi).
Mục tiêu của tôi là đảm bảo rằng mọi lõi của kiến trúc đều thực hiện các lệnh CÙNG. Giả sử rằng mã của tôi sẽ không yêu cầu đăng ký hơn những cái có sẵn trong mỗi SM, tôi tưởng tượng tiếp cận khác nhau:
tôi tạo 8 khối 48 bài mỗi, để mỗi SM có 1 khối để thực thi. Trong trường hợp này sẽ 48 chủ đề thực hiện song song trong SM (khai thác tất cả 48 lõi có sẵn cho họ)?
Có sự khác biệt nào nếu tôi khởi chạy 64 khối gồm 6 luồng không? (Giả sử rằng chúng sẽ được ánh xạ đồng đều giữa các SM)
Nếu tôi "nhấn chìm" GPU trong công việc được lập biểu (ví dụ: tạo 1024 khối 1024 luồng) là hợp lý để giả định rằng tất cả các lõi sẽ được sử dụng tại một điểm nhất định, và sẽ thực hiện các tính toán tương tự (giả sử rằng các chủ đề không bao giờ gian hàng)?
Có cách nào để kiểm tra các tình huống này bằng cách sử dụng trình hồ sơ không?
Có bất kỳ tham chiếu nào cho nội dung này không?Tôi đọc hướng dẫn lập trình CUDA và các chương dành riêng cho kiến trúc phần cứng trong "Lập trình xử lý song song lớn" và "Thiết kế và phát triển ứng dụng CUDA"; nhưng tôi không thể có được câu trả lời chính xác.
Cảm ơn bạn đã trả lời của bạn. Tôi đọc các tài liệu tham khảo, nhưng có một vài điều mà tôi không hiểu trong câu trả lời của bạn.Trong các câu hỏi sau tôi giả định rằng chúng tôi đang sử dụng kiến trúc Fermi với 48 lõi (16 lõi * 3 "nhóm lõi"): 1. Bạn đã đề cập một ánh xạ giữa các lõi và làn đường. Loại bản đồ là gì? 2. Từ các tài liệu tham khảo tôi nhận được rằng mỗi "nhóm lõi" thực hiện tối đa một nửa dọc (16 chủ đề) cho mỗi chu kỳ đồng hồ. Vì vậy, về mặt lý thuyết nếu chúng ta có 48 luồng trong cùng một khối, chúng sẽ được tổ chức thành 3 nửa dọc và thực hiện song song trên 48 lõi. Tôi có đúng không? – Daedalus
CUDA lõi là số đơn vị FP chính xác duy nhất. Suy nghĩ về việc thực hiện về lõi CUDA là không chính xác. Mỗi sợi dọc có 32 luồng. Các luồng này sẽ được cấp cho một nhóm các đơn vị thực thi (ví dụ: 16 lõi cuda). Để phát hành cho tất cả 48 lõi trong một đồng hồ đơn, một trong hai bộ lập lịch dọc cần chọn một sợi dọc đáp ứng yêu cầu của cặp siêu thanh và cả hai hướng dẫn phải là loại được thực thi bởi lõi CUDA. Ngoài ra, các trình lập lịch trình dọc khác phải chọn một sợi dọc mà chỉ lệnh tiếp theo sẽ được thực hiện bởi lõi CUDA. –
Không có yêu cầu rằng warps được trong cùng một khối hoặc warps trong một khối có cùng một truy cập chương trình. –