Tôi đã sử dụng CUDA được vài tuần, nhưng tôi có một số nghi ngờ về việc phân bổ các khối / sợi dọc / luồng. Tôi đang nghiên cứu kiến trúc từ quan điểm giáo khoa (dự án đại học), vì vậy đạt được hiệu suất cao nhất không phải là mối quan tâm của tôi.
Trước hết, tôi muốn hiểu nếu tôi nói thẳng những điều này:
Lập trình viên viết một kernel và tổ chức thực hiện nó trong một lưới các khối luồng.
Mỗi khối được gán cho Bộ đa xử lý phát trực tuyến (SM). Sau khi được chỉ định, nó không thể di chuyển sang SM khác.
Mỗi SM chia các khối riêng của mình thành Warps (hiện có kích thước tối đa là 32 luồng). Tất cả các luồng trong một sợi dọc thực thi đồng thời trên các tài nguyên của SM.
Việc thực thi thực tế của một luồng được thực hiện bởi các lõi CUDA có trong SM. Không có ánh xạ cụ thể giữa các luồng và lõi.
Nếu một sợi dọc chứa 20 luồng, nhưng hiện tại chỉ có 16 lõi có sẵn, sợi dọc sẽ không chạy.
Mặt khác, nếu một khối chứa 48 luồng, nó sẽ được chia thành 2 sợi dọc và chúng sẽ thực thi song song với điều kiện là có đủ bộ nhớ.
Nếu một luồng bắt đầu trên một lõi, thì nó bị đình trệ để truy cập bộ nhớ hoặc cho một hoạt động điểm nổi dài, việc thực thi của nó có thể tiếp tục trên một lõi khác.
Họ có đúng không?
Bây giờ, tôi có GeForce 560 Ti nên theo thông số kỹ thuật, nó được trang bị 8 SM, mỗi lõi 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 hướng dẫn CÙNG. Giả sử rằng mã của tôi sẽ không yêu cầu đăng ký nhiều hơn mã có sẵn trong mỗi SM, tôi tưởng tượng các cách tiếp cận khác nhau:
Tôi tạo 8 khối gồm 48 luồng mỗi luồng, để mỗi SM có 1 khối để thực thi. Trong trường hợp này, 48 luồng sẽ thực thi song song trong SM (khai thác tất cả 48 lõi có sẵn cho chúng)?
Có sự khác biệt nào không nếu tôi khởi chạy 64 khối 6 luồng? (Giả sử rằng họ 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ên lịch (ví dụ, tạo ra 1024 khối của mỗi luồng 1024) thì có lý khi cho 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 phép tính tương tự (giả sử rằng các luồng không bao giờ bị đình trệ)?
Có cách nào để kiểm tra các tình huống này bằng cách sử dụng hồ sơ không?
Có bất kỳ tài liệu tham khảo cho công cụ này? 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 bộ 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 một câu trả lời chính xác.