Tôi đang thiết kế một bộ các hàm toán học và triển khai chúng trong cả hai phiên bản CPU và GPU (với CUDA).Bộ nhớ CUDA cho các bảng tra cứu
Một số chức năng này dựa trên bảng tra cứu. Hầu hết các bảng đều có 4KB, một số trong số đó có nhiều hơn một chút. Các hàm dựa trên bảng tra cứu lấy đầu vào, chọn một hoặc hai mục nhập của bảng tra cứu và sau đó tính kết quả bằng cách nội suy hoặc áp dụng các kỹ thuật tương tự.
Câu hỏi của tôi bây giờ là: tôi nên lưu các bảng tra cứu này ở đâu? Một thiết bị CUDA có nhiều nơi để lưu trữ các giá trị (bộ nhớ toàn cục, bộ nhớ không đổi, bộ nhớ kết cấu, ...). Với điều kiện mỗi bảng có thể được đọc đồng thời bởi nhiều luồng và giá trị đầu vào, và do đó chỉ số tra cứu, có thể hoàn toàn không tương quan giữa các chuỗi của mỗi warp (kết quả là truy cập bộ nhớ không tương quan), bộ nhớ nào cung cấp truy cập nhanh nhất?
Tôi thêm rằng nội dung của các bảng này được precomputed và hoàn toàn không đổi.
EDIT
Chỉ cần làm rõ: Tôi cần lưu trữ khoảng 10 bảng tra cứu 4KB khác nhau. Dù sao cũng sẽ tuyệt vời khi biết giải pháp thời tiết như đối với trường hợp này sẽ giống nhau đối với trường hợp, ví dụ: 100 bảng 4KB hoặc ví dụ: 10 bảng tra cứu 16KB.
Bộ nhớ cache liên tục dành cho trường hợp phát sóng, tức là truy cập trên một sợi dọc là đồng nhất. Nó sẽ hoạt động nếu tất cả các luồng trong truy cập dọc các vị trí khác nhau nhưng hiệu năng bị ảnh hưởng. Bộ nhớ chia sẻ nhanh và có dung lượng 48KB nên phù hợp, nhưng bạn có thể cần nó cho các mục đích khác, hoặc mã của bạn là một phần của thư viện nơi mà nó không hoạt động tốt. Nếu bạn không thể sử dụng bộ nhớ chia sẻ, tôi sẽ đề nghị kết cấu. Tốt nhất là không nên sử dụng bất kỳ bảng nào trên GPU (xem thêm thư viện toán CUDA), vì FLOPS đang tăng nhanh hơn băng thông bộ nhớ trên các thế hệ GPU. – njuffa
Cảm ơn, njuffa, vì lời giải thích rõ ràng. Câu hỏi duy nhất của tôi là về bộ nhớ dùng chung. Nếu tôi nhớ chính xác, bộ nhớ này được chia sẻ giữa các chủ đề trong cùng một sợi dọc. Vì vậy, tôi có nên nhân rộng các bảng của tôi trên tất cả các warps? Và các bảng sẽ được lưu lại sau khi kết thúc hạt nhân? – Spiros
Bộ nhớ dùng chung được chia sẻ giữa tất cả các chuỗi trong chuỗi chủ đề. Vì vậy, tôi sợ với tổng số 40KB bảng lưu trữ mã của bạn sẽ được giới hạn trong một khối chuỗi duy nhất cho mỗi SM.Trong hầu hết các trường hợp, tốt nhất nên có ít nhất hai chuỗi luồng đang chạy, vì vậy bạn có thể cân nhắc sử dụng lược đồ hỗn hợp trong đó một số bảng được lưu trữ trong bộ nhớ dùng chung (bộ nhớ được truy cập nhiều nhất) và các bảng khác trong bộ nhớ kết cấu. Bộ nhớ kết cấu cũng có lợi thế là bạn có thể có được nội suy tuyến tính (độ chính xác thấp) miễn phí. Bạn đang thực hiện những loại hàm toán học nào cần bảng lớn? – njuffa