2012-04-21 30 views
12

Theo "CUDA C Programming Guide", quyền truy cập bộ nhớ không đổi chỉ có lợi nếu bộ nhớ cache liên bộ đa bộ được nhấn (Mục 5.3.2.4) . Nếu không, có thể có nhiều yêu cầu bộ nhớ hơn cho một nửa sợi dọc hơn trong trường hợp đọc bộ nhớ toàn cầu kết hợp. Vậy tại sao kích thước bộ nhớ không đổi được giới hạn ở 64 KB?Tại sao kích thước bộ nhớ không đổi bị hạn chế trong CUDA?

Một câu hỏi khác để không hỏi hai lần. Theo như tôi hiểu, trong kiến ​​trúc Fermi, cache kết cấu được kết hợp với bộ đệm L2. Việc sử dụng kết cấu vẫn có ý nghĩa hay đọc bộ nhớ toàn cục được lưu trữ theo cùng một cách?


liên tục Memory (Mục 5.3.2.4)

Không gian bộ nhớ liên tục nằm trong bộ nhớ điện thoại và được lưu trữ trong bộ nhớ cache liên tục đề cập tại mục F.3.1 và F. 4.1.

Đối với các thiết bị có khả năng tính toán 1.x, yêu cầu bộ nhớ liên tục cho một sợi dọc được chia thành hai yêu cầu, một cho mỗi nửa dọc, được phát hành độc lập.

Yêu cầu sau đó được chia thành nhiều yêu cầu riêng biệt vì có các địa chỉ bộ nhớ khác nhau trong yêu cầu ban đầu, giảm thông lượng theo hệ số bằng số yêu cầu riêng biệt.

Các yêu cầu kết quả sau đó được phục vụ tại thông lượng của bộ đệm không đổi trong trường hợp có lần truy cập bộ nhớ cache hoặc thông lượng bộ nhớ thiết bị khác.

Trả lời

15

Kích thước bộ nhớ không đổi là 64 KB cho khả năng tính toán 1.0-3.0 thiết bị. Bộ làm việc bộ đệm chỉ là 8KB (xem Hướng dẫn lập trình CUDA v4.2 Bảng F-2).

Bộ nhớ liên tục được trình điều khiển, trình biên dịch và các biến được khai báo __device__ __constant__. Trình điều khiển sử dụng bộ nhớ liên tục để truyền thông số, kết cấu kết cấu, vv Trình biên dịch sử dụng hằng số trong nhiều hướng dẫn (xem tháo gỡ).

Các biến được đặt trong bộ nhớ không đổi có thể được đọc và ghi bằng các hàm thời gian chạy máy chủ cudaMemcpyToSymbol()cudaMemcpyFromSymbol() (xem Hướng dẫn lập trình CUDA phần v.2.2 B.2.2). Bộ nhớ không đổi nằm trong bộ nhớ thiết bị nhưng được truy cập thông qua bộ đệm không đổi.

Trên kết cấu Fermi, hằng số, L1 và I-Cache là tất cả các cache cấp 1 trong hoặc xung quanh mỗi SM. Tất cả cache cấp 1 đều truy cập bộ nhớ thiết bị thông qua cache L2.

Giới hạn hằng số 64 KB là mỗi CUmodule là đơn vị biên dịch CUDA. Khái niệm CUmodule được ẩn trong thời gian chạy CUDA nhưng có thể truy cập được bằng API trình điều khiển CUDA.

+1

Greg, tôi xin lỗi vì có thể không đủ rõ ràng. Tôi biết cách sử dụng bộ nhớ liên tục. Trong câu hỏi tôi tự hỏi tại sao kích thước của bộ nhớ liên tục được giới hạn đến 64 KB nếu chỉ lưu trữ 8 KB thực sự cung cấp hiệu suất tốt hơn so với bộ nhớ toàn cầu. Trong cùng một cách thức bộ nhớ toàn cầu có thể được truy cập thông qua bộ nhớ cache L1. Vì vậy, từ quan điểm lập trình xem sự khác nhau giữa việc sử dụng bộ nhớ toàn cục hoặc bộ nhớ không đổi là cả hai đều được lưu trữ theo cùng một cách? – AdelNick

+6

Bộ nhớ cache không đổi có kích thước tối ưu cho đồ họa và bóng đổ tính toán. API CUDA hiển thị bộ nhớ cache liên tục để các nhà phát triển có thể tận dụng bộ nhớ cache bổ sung. Bộ đệm không đổi có hiệu suất tối ưu khi tất cả các luồng truy cập cùng một địa chỉ.Số lần truy cập rất nhanh. Misses có thể có hiệu suất tương tự của một miss L1. Bộ nhớ đệm liên tục có thể được sử dụng để giảm sự va đập của L1. Khả năng tính toán 1.x thiết bị không có bộ nhớ cache L1 hoặc L2 để bộ nhớ cache liên tục được sử dụng để tối ưu hóa một số truy cập. –

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