2013-06-13 40 views
7

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.

+4

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

+0

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

+2

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

Trả lời

2

Bộ nhớ kết cấu (bây giờ được gọi là bộ nhớ cache dữ liệu chỉ đọc) có thể là một lựa chọn đáng để khám phá, mặc dù không phải vì lợi ích nội suy. Nó hỗ trợ đọc 32 bit mà không cần đọc vượt quá số tiền này. Tuy nhiên, bạn bị giới hạn trong tổng số 48K. Đối với Kepler (tính toán 3.x), chương trình này khá đơn giản.

Bộ nhớ chung, trừ khi bạn định cấu hình ở chế độ 32 bit, thường sẽ kéo trong 128 byte cho mỗi chuỗi, cực nhân nhân dữ liệu thực sự cần từ bộ nhớ vì bạn (dường như) không thể kết hợp truy cập bộ nhớ. Vì vậy, chế độ 32 bit có lẽ là những gì bạn cần nếu bạn muốn sử dụng hơn 48K (bạn đã đề cập 40K). Nếu bạn truy cập một tập hợp các giá trị theo chuỗi từ các bảng này, bạn có thể xen kẽ các bảng sao cho các kết hợp này có thể được nhóm lại và đọc dưới dạng đọc 64 bit hoặc 128 bit cho mỗi chuỗi. Điều này có nghĩa là 128 byte đọc từ bộ nhớ toàn cầu có thể hữu ích.

Sự cố bạn sẽ gặp phải là bạn đang làm cho băng thông bộ nhớ giải pháp bị giới hạn bằng cách sử dụng bảng tra cứu. Thay đổi kích thước bộ nhớ cache L1 (trên Fermi/tính 2.x) thành 48K có thể sẽ tạo ra sự khác biệt đáng kể, đặc biệt nếu bạn không sử dụng 32K bộ nhớ chia sẻ khác. Hãy thử bộ nhớ kết cấu và sau đó bộ nhớ toàn cầu ở chế độ 32 bit và xem bộ nhớ nào hoạt động tốt nhất cho thuật toán của bạn. Cuối cùng chọn một thẻ với một con số băng thông bộ nhớ tốt nếu bạn có một sự lựa chọn trên phần cứng.

Các vấn đề liên quan