Truy cập bộ nhớ tối ưu khi sử dụng bảng tra cứu trên GPU?


9

Tôi đang khám phá các thuật toán isosurface trên GPU cho dự án cử nhân (đặc biệt tập trung vào dữ liệu voxel nhị phân vào / ra thay vì các trường có giá trị thực). Vì vậy, tôi đã triển khai CPU cho các khối diễu hành cũ tốt và chạy trong OpenFrameworks, và bây giờ đang ở giai đoạn cố gắng chuyển nó sang các shader tính toán GLSL và xem xét các cạm bẫy trước khi tôi lặn. Tôi chỉ viết các shader và mảnh trước đây tất cả đều mới đối với tôi.

Vấn đề đầu tiên của tôi là làm thế nào để sử dụng hiệu quả một bảng tra cứu trên hàng chục hoặc hàng trăm luồng trong một nhóm làm việc? Tôi hiểu rằng GPU có các loại bộ nhớ khác nhau cho các tác vụ khác nhau nhưng không hoàn toàn chắc chắn về cách thức hoạt động của từng loại hoặc loại sử dụng.

Bảng copypasta cổ điển của Paul Bourke là một mảng 256 * 16, vì vậy nếu sử dụng kiểu byte vô hướng, điều này có thể được đóng gói vào kết cấu 4kb hoặc SSBO.

Câu hỏi là, làm thế nào để ngăn chặn các chủ đề khác nhau vấp ngã nhau? Nhiều khối trong mỗi nhóm công việc có khả năng có cùng cấu hình do đó cố gắng truy cập cùng một vị trí trong bộ đệm cùng một lúc. Có một cách giải quyết hoặc tối ưu hóa để giải quyết vấn đề này?


Nếu đó là bảng tra cứu chỉ đọc, bạn chỉ có thể sử dụng bộ đệm / kết cấu. Bạn có thể đóng gói nó thành một trong các định dạng kết cấu thông thường hoặc bạn có thể sử dụng một số tính năng mới hơn của DX11 / OpenGL để có định dạng tùy chỉnh. UAV trong vùng đất DX11 hoặc kết cấu / shader_image_load_store trong vùng đất OpenGL.
RichieSams

Ngoài ra, hãy xem bản trình bày này: cvg.ethz.ch/teaching/2011spring/gpgpu/cuda_memory.pdf Nó dành cho CUDA, nhưng nó sẽ cho bạn ý tưởng tốt hơn về những gì đang xảy ra trên phần cứng cơ bản
RichieSams

Không phải là một câu trả lời đầy đủ nhưng dung lượng bộ nhớ bạn sử dụng càng nhỏ càng tốt, vì nó sẽ có nhiều khả năng phù hợp với bộ nhớ cache và có ít lỗi nhớ cache hơn. Nếu bạn có các giá trị nội suy, giống như bạn đang đưa các điểm trên một đường cong vào kết cấu, bạn có thể kiểm tra xem đây là cách để có được các bảng tra cứu đường cong chất lượng cao hơn với ít bộ nhớ hơn: blog.demofox.org/2016/02/22/
Alan Wolfe

Câu trả lời:


6

Nơi tốt nhất để đặt bảng tra cứu cho trình đổ bóng tính toán GPU phụ thuộc vào kích thước của bảng tra cứu và tần suất / sự kết hợp của truy cập. Trong trường hợp của bạn (bạn đã đề cập 4kb), bộ nhớ cục bộ được chia sẻ có thể là tốt nhất (giả sử bạn không cần bộ nhớ này cho các mục đích khác trong cùng một hạt nhân). Bộ nhớ này có các tên khác nhau trong các API khác nhau, nhưng là cùng một kiến ​​trúc và tuân theo các nguyên tắc hiệu suất giống nhau:

  • CUDA: bộ nhớ chia sẻ nhóm
  • DirectCompute: bộ nhớ chia sẻ nhóm
  • OpenCL: bộ nhớ cục bộ
  • Kim loại: bộ nhớ luồng
  • OpenGL: bộ nhớ dùng chung

Lưu trữ bảng tra cứu trong bộ nhớ chung dưới dạng bộ đệm chỉ đọc cũng có thể hoạt động tốt, tùy thuộc vào kích thước bộ đệm của GPU cụ thể mà bạn đang chạy.

Lưu ý rằng tôi cho rằng đây là bảng tra cứu chỉ đọc. Bảng tra cứu đọc-ghi là một con thú hoàn toàn khác và bạn không có lựa chọn nào tốt ở đó.


Cũng có trường hợp bộ đệm chỉ đọc sẽ làm tốt hơn việc lưu trữ 4kb dữ liệu chỉ đọc trong bộ nhớ cục bộ được chia sẻ. Ví dụ, lưu trữ nó trong bộ nhớ cục bộ có thể có nghĩa là có một bản sao duy nhất của dữ liệu của bạn cho mỗi nhóm luồng. Nếu bộ đệm vừa với bộ đệm, thì bộ đệm có thể hoạt động tốt hơn bộ nhớ cục bộ cho các mẫu truy cập chỉ đọc.
John Calsbeek

Cảm ơn các bạn đã phản hồi. Tôi đã hoàn thành dự án mà tôi đang sử dụng cho đến bây giờ và chỉ sử dụng kết cấu bộ đệm chỉ đọc r8ui, hoạt động khá độc đáo :)
russ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.