2011-07-11 30 views
7

Khi tôi ràng buộc một mảng tới một kết cấu trong CUDA,CUDA bộ nhớ kết cấu không gian

  1. là mảng bản sao đến một không gian kết cấu? hoặc,
  2. là tham chiếu mảng đó là kết cấu?

Nếu câu trả lời là 1., sau đó tôi có thể ràng buộc kết cấu và dữ liệu tìm nạp an toàn từ không gian bộ nhớ kết cấu trong khi tôi ghi kết quả vào mảng được cấp phát trong bộ nhớ chung.

Nếu câu trả lời là 2., thì, bộ nhớ kết cấu là không gian bộ nhớ toàn cục, nơi dữ liệu được lưu trong bộ nhớ cache và tìm nạp không gian?

Tôi muốn biết về chủ đề này, vì tôi đã thấy một số câu hỏi liên quan đến chủ đề này và tôi không có câu trả lời rõ ràng ngay bây giờ.

Xin cảm ơn trước.

Trả lời

13

Câu trả lời là tùy chọn thứ hai, nhưng từ đó mọi thứ trở nên phức tạp hơn một chút. Không có thứ gì như "bộ nhớ kết cấu", chỉ toàn bộ bộ nhớ được truy cập thông qua phần cứng chuyên dụng bao gồm bộ nhớ đệm trên GPU (6-8kb/MP tùy thuộc vào thẻ, xem bảng F-2 trong Phụ lục F của Hướng dẫn lập trình Cuda) và một số hành động lọc/nội suy tăng tốc phần cứng. Có hai cách mà phần cứng kết cấu có thể được sử dụng trong CUDA:

  1. Kết nối bộ nhớ tuyến tính với kết cấu và đọc từ hạt nhân trong hạt nhân bằng API lấy 1D. Trong trường hợp này phần cứng kết cấu thực sự chỉ hoạt động như một bộ nhớ đệm đọc, và (IIRC) không có sẵn các hành động lọc.
  2. Tạo một mảng CUDA, sao chép nội dung của bộ nhớ tuyến tính vào mảng đó và kết nối nó với một kết cấu. Mảng CUDA kết quả chứa một phiên bản theo thứ tự không gian của nguồn tuyến tính, được lưu trữ trong bộ nhớ toàn cục trong một số loại (không có giấy tờ) space filling curve. Phần cứng kết cấu cung cấp truy cập được lưu vào bộ nhớ cache cho mảng đó, bao gồm bộ nhớ đồng thời đọc với bộ lọc tăng tốc phần cứng.

Bạn có thể tìm thấy tổng quan về kiến ​​trúc GT200 được viết bởi David Kanter đáng đọc để hiểu rõ hơn cách kiến ​​trúc thực tế triển khai hệ thống phân cấp bộ nhớ mà API hiển thị.

+0

Câu trả lời tuyệt vời :) Không có giấy tờ và tin đồn là những gì tôi muốn biết;) Vì vậy, nếu tôi viết vào mảng ban đầu và lấy dữ liệu từ kết cấu bị ràng buộc, hành vi là không xác định, phải không ?. Cảm ơn bạn. – pQB

+3

Trong CUDA, kết cấu và mảng là mờ đục, chỉ đọc các đối tượng. Không được phép viết (thậm chí không có sự đảm bảo rằng bố cục kết cấu bên trong giống nhau giữa các phần cứng khác nhau). Nếu bạn có thẻ Fermi và đang sử dụng CUDA 3.2 hoặc mới hơn, bạn có thể sử dụng các bề mặt. [API bề mặt] (http://developer.download.nvidia.com/compute/cuda/3_1/toolkit/docs/online/group__CUDART__SURFACE.html) cung cấp cả đọc và ghi vào "họa tiết", mặc dù không có bộ lọc hỗ trợ hiện tại, AFIAK. – talonmies

+3

Trong lời gọi hạt nhân, bộ đệm kết cấu không duy trì sự kết hợp với bộ nhớ bộ nhớ cơ bản toàn cầu, xem phần 3.2.10.4 của Hướng dẫn lập trình. Các kết cấu 2D sử dụng bộ lọc không nhất thiết phải được ràng buộc với một cudaArray mờ đục, chúng cũng có thể bị ràng buộc với bộ nhớ tuyến tính được phân bổ với cudaMallocPitch(). – njuffa

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