2012-05-05 29 views
104

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:

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

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

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

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

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

  6. 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ớ.

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

  1. 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ọ)?

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

  3. 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)?

  4. 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?

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

Trả lời

94

Hai trong số các tài liệu tham khảo tốt nhất là

  1. NVIDIA Fermi Compute Architecture Whitepaper
  2. GF104 Reviews

tôi sẽ cố gắng trả lời từng câu hỏi của bạn.

Lập trình viên chia công việc thành chuỗi, chuỗi thành chuỗi chuỗi và chặn chuỗi thành lưới. Nhà phân phối công việc tính toán phân bổ các khối luồng cho các bộ xử lý đa luồng (SM). Khi một khối luồng được phân phối cho một SM, tài nguyên cho khối luồng được phân bổ (warps và bộ nhớ dùng chung) và các luồng được chia thành các nhóm gồm 32 luồng được gọi là warps. Khi một sợi dọc được phân bổ, nó được gọi là sợi dọc hoạt động. Hai bộ lập lịch dọc sẽ chọn hai warps hoạt động trên mỗi chu kỳ và gửi các warps đến các đơn vị thực thi. Để biết thêm chi tiết về các đơn vị thực hiện và công văn hướng dẫn, hãy xem 1 p.7-10 và 2.

4 '. Có một ánh xạ giữa laneid (chỉ số luồng trong một sợi dọc) và một lõi.

5 '. Nếu một sợi dọc chứa ít hơn 32 luồng, nó sẽ trong hầu hết các trường hợp được thực hiện giống như nó có 32 luồng. Warps có thể có ít hơn 32 thread hoạt động vì nhiều lý do: số lượng luồng cho mỗi khối không chia hết cho 32, chương trình thực hiện một khối khác nhau sao cho các luồng không lấy đường dẫn hiện tại được đánh dấu là không hoạt động, hoặc một sợi trong sợi dọc thoát ra.

6 '. Một khối chủ đề sẽ được chia thành WarpsPerBlock = (ThreadsPerBlock + WarpSize - 1)/WarpSize Không có yêu cầu cho các bộ lập lịch dọc để chọn hai warps từ cùng một khối luồng.

7 '. Một đơn vị thực hiện sẽ không dừng lại trên một hoạt động bộ nhớ. Nếu một tài nguyên không có sẵn khi một lệnh sẵn sàng để được gửi đi, lệnh sẽ được gửi lại trong tương lai khi tài nguyên có sẵn. Warps có thể đứng tại các rào cản, hoạt động bộ nhớ, hoạt động kết cấu, phụ thuộc dữ liệu, ... Một warp bị trì hoãn không đủ điều kiện để được chọn bởi bộ lập lịch warp. Trên Fermi, rất hữu ích khi có ít nhất 2 warp đủ điều kiện trên mỗi chu kỳ để bộ lập lịch warp có thể đưa ra một lệnh.

Xem tham chiếu 2 cho sự khác biệt giữa GTX480 và GTX560.

Nếu bạn đọc tài liệu tham khảo (vài phút), tôi nghĩ bạn sẽ thấy rằng mục tiêu của bạn không có ý nghĩa. Tôi sẽ cố gắng trả lời các điểm của bạn.

1 '. Nếu bạn khởi động hạt nhân < < < 8, 48 >>> bạn sẽ nhận được 8 khối với 2 chuỗi 32 và 16 luồng. Không có gì đảm bảo rằng 8 khối này sẽ được gán cho các SM khác nhau. Nếu 2 khối được cấp phát cho một SM thì có thể mỗi bộ lập lịch dọc có thể chọn một sợi dọc và thực hiện dọc. Bạn sẽ chỉ sử dụng 32 trong số 48 lõi.

2 '.Có một sự khác biệt lớn giữa 8 khối của 48 chủ đề và 64 khối của 6 chủ đề. Giả sử rằng hạt nhân của bạn không có sự phân kỳ và mỗi luồng thực hiện 10 lệnh.

  • 8 khối với 48 chủ đề = 16 warps * 10 hướng dẫn = 160 hướng dẫn
  • 64 khối với 6 đề = 64 warps * 10 hướng dẫn = 640 hướng dẫn

Để có được hiệu quả tối ưu các phân chia công việc phải là bội số của 32 luồng. Phần cứng sẽ không kết hợp các chủ đề từ các warps khác nhau.

3 '. Một GTX560 có thể có 8 SM * 8 khối = 64 khối tại một thời điểm hoặc 8 SM * 48 warps = 512 warps nếu hạt nhân không tối đa đăng ký hoặc bộ nhớ chia sẻ. Tại bất kỳ thời điểm nào trên một phần công việc sẽ hoạt động trên các SM. Mỗi SM có nhiều đơn vị thực hiện (nhiều hơn lõi CUDA). Tài nguyên nào đang được sử dụng tại bất kỳ thời điểm nào phụ thuộc vào các bộ lập lịch dọc và kết hợp lệnh của ứng dụng. Nếu bạn không thực hiện các hoạt động TEX thì các đơn vị TEX sẽ không hoạt động. Nếu bạn không thực hiện thao tác dấu chấm động đặc biệt, các đơn vị SUFU sẽ không hoạt động.

4 '. Parallel Nsight và Visual Profiler hiển thị

a. được thực hiện IPC

b. đã cấp IPC

c. hoạt động warps cho mỗi chu kỳ hoạt động

d. warps đủ điều kiện cho mỗi chu kỳ hoạt động (chỉ Nsight)

e. warp stall reasons (Nsight only)

f. chủ đề hoạt động cho mỗi lệnh được thực hiện

Trình lược tả không hiển thị phần trăm sử dụng của bất kỳ đơn vị thực thi nào. Đối với GTX560, ước tính sơ bộ sẽ là IssuedIPC/MaxIPC. Đối với MaxIPC giả sử GF100 (GTX480) là 2 GF10x (GTX560) là 4 nhưng mục tiêu là 3 là mục tiêu tốt hơn.

+0

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

+0

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

+0

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

5

"E. 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."

không chính xác. Bạn đang nhầm lẫn lõi theo nghĩa thông thường của họ (cũng được sử dụng trong CPU) - số lượng "đa xử lý" trong GPU, với lõi trong tiếp thị nVIDIA nói ("thẻ của chúng tôi có hàng ngàn lõi CUDA").

Bản thân sợi dọc chỉ có thể được lên lịch trên một lõi đơn (= bộ đa xử lý) và có thể chạy tối đa 32 luồng cùng một lúc; nó không thể sử dụng nhiều hơn một lõi đơn.

Số "48 warps" là số lượng lớn nhất của warps đang hoạt động (warps có thể được chọn để lên lịch cho công việc trong chu kỳ tiếp theo, tại bất kỳ chu kỳ nhất định nào) trên mỗi bộ xử lý, trên GPU nVIDIA với tính khả năng tính toán 2.x ; và con số này tương ứng với 1536 = 48 x 32 luồng.

trả lời dựa trên this webinar

+0

@GregSmith: Đã chỉnh sửa câu trả lời để giải quyết vấn đề này. Thật tốt khi bạn kiên nhẫn với nó, nhưng - đã 5 năm rồi ... – einpoklum

+0

lõi đơn (= bộ xử lý đa)? Tôi nghĩ rằng câu hỏi giả định thuật ngữ đơn lõi = bộ vi xử lý và không multiprocessor. Với thuật ngữ của bạn câu trả lời của bạn là chính xác. – Adarsh