Tình hình hơi phức tạp hơn những gì bạn mô tả.
ALUs (lõi), đơn vị tải/lưu trữ (LD/ST) và Đơn vị chức năng đặc biệt (SFU) (màu xanh lá cây trong hình ảnh) là đơn vị đường ống. Họ giữ kết quả của nhiều tính toán hoặc hoạt động cùng một lúc, trong các giai đoạn hoàn thành khác nhau. Vì vậy, trong một chu kỳ, họ có thể chấp nhận một hoạt động mới và cung cấp kết quả của một hoạt động khác đã được bắt đầu từ lâu (khoảng 20 chu kỳ cho ALU, nếu tôi nhớ chính xác). Vì vậy, một SM duy nhất trong lý thuyết có nguồn lực để xử lý 48 * 20 chu kỳ = 960 ALU hoạt động cùng một lúc, đó là 960/32 chủ đề cho mỗi warp = 30 warps. Ngoài ra, nó có thể xử lý các hoạt động LD/ST và các hoạt động SFU ở bất kỳ độ trễ và thông lượng nào của chúng.
Bộ lập lịch dọc (màu vàng trong hình ảnh) có thể lên lịch 2 * 32 luồng mỗi sợi dọc = 64 chủ đề cho đường ống mỗi chu kỳ. Vì vậy, đó là số lượng kết quả có thể thu được trên mỗi đồng hồ. Vì vậy, cho rằng có một sự kết hợp của tài nguyên máy tính, 48 lõi, 16 LD/ST, 8 SFU, mỗi có độ trễ khác nhau, một hỗn hợp của warps đang được xử lý cùng một lúc. Tại bất kỳ chu kỳ nhất định nào, các bộ lập lịch dọc sẽ cố gắng "ghép nối" hai xung đột để lên lịch, để tối đa hóa việc sử dụng SM.
Bộ lập lịch warp có thể phát hành cảnh báo từ các khối khác nhau hoặc từ các vị trí khác nhau trong cùng một khối, nếu các lệnh độc lập. Vì vậy, warps từ nhiều khối có thể được xử lý cùng một lúc.
Thêm vào sự phức tạp, warps đang thực hiện các hướng dẫn có ít hơn 32 tài nguyên, phải được phát hành nhiều lần cho tất cả các chuỗi được phục vụ. Ví dụ, có 8 SFUs, do đó có nghĩa là một sợi dọc chứa một lệnh yêu cầu các SFU phải được lên lịch 4 lần.
Mô tả này được đơn giản hóa. Có những hạn chế khác cũng được đưa ra để xác định cách GPU lên lịch công việc. Bạn có thể tìm thêm thông tin bằng cách tìm kiếm trên web cho "kiến trúc fermi".
Vì vậy, sắp tới cho câu hỏi thực tế của bạn,
tại sao bận tâm để biết về warps?
Biết số lượng chủ đề trong sợi dọc và xem xét chủ đề trở nên quan trọng khi bạn cố gắng tối đa hóa hiệu suất của thuật toán.Nếu bạn không làm theo các quy tắc, bạn sẽ mất hiệu suất:
Trong invocation hạt nhân, <<<Blocks, Threads>>>
, hãy cố gắng chọn một số chủ đề mà chia đồng đều với số lượng bài trong một warp. Nếu không, bạn kết thúc bằng việc khởi chạy một khối có chứa các chuỗi không hoạt động.
Trong hạt nhân, hãy cố gắng để mỗi sợi trong một sợi dọc theo cùng một đường dẫn mã. Nếu bạn không, bạn sẽ có được những gì được gọi là phân kỳ dọc. Điều này xảy ra vì GPU phải chạy toàn bộ dọc qua từng đường dẫn mã khác nhau.
Trong hạt nhân của bạn, hãy cố gắng có từng luồng trong tải dọc và lưu trữ dữ liệu trong các mẫu cụ thể. Ví dụ, có các luồng trong một truy vấn dọc tiếp cận từ 32 bit trong bộ nhớ toàn cục.
Hầu hết các đoạn đầu tiên của câu hỏi của bạn là hoàn toàn không chính xác, và kết quả là phần còn lại của câu hỏi của bạn không có ý nghĩa nhiều. – talonmies