2015-07-05 20 views
5

Tôi đang tạo lưới từ dữ liệu thể tích bằng thuật toán Marching Cubes chạy trên CUDA.Cách tối ưu hóa VBO/IBO để tối đa hóa việc sử dụng bộ nhớ cache GPU

Tôi đã thử lưu lưới và hiển thị theo 3 cách.

  1. lưu tập hợp tam giác thô làm mảng dữ liệu đỉnh liên tục. tôi ước tính kích thước nếu đèo đầu tiên, tạo một OpenGL VBO, bản đồ nó để CUDA và viết dữ liệu đỉnh để nó ở định dạng dưới đây

V0x, V0y, V0z, N0x, N0y, N0z, V1x, V1y, V1z, N1x, N1y, N1z, ...

và vẽ nó bằng cách sử glDrawArrays().

Đỉnh dự phòng trong VBO, Đỉnh dự phòng trên mỗi khối, Không có chỉ mục.

  1. Hãy lưới từ bước 1, sử dụng thrust::sort()thrust::unique() để loại bỏ đỉnh không cần thiết, chỉ số tính toán sử dụng thrust::lower_bound(). lưu kết quả vào một OpenGL VBO/IBO ánh xạ tới CUDA. vẽ mô hình bằng cách sử dụng glDrawElements().

Không có đỉnh dự phòng trong VBO, chỉ mục được tạo.

  1. Tạo danh sách duy nhất các đỉnh trên mỗi hình khối, lưu trữ chúng trong VBO cùng với chỉ mục của chúng tạo thành hình tam giác trong IBO. Render bằng cách sử dụng glDrawElements().
  2. Vertices

Redundant trong VBO, Unique Vertices mỗi Cube, chỉ số tạo mỗi Cube

Bây giờ FPS tôi nhận được cho các tập dữ liệu cùng một lúc cùng một tiêu chuẩn ISO-Value `là

Method 1 : 92 FPS, 30,647,016 Verts,   0 Indices 
Method 2 : 122 FPS, 6,578,066 Verts, 30,647,016 Indices 
Method 3 : 140 FPS, 20,349,880 Verts, 30,647,016 Indices 

Mặc dù Phương pháp 2 mang lại số đỉnh tối thiểu, FPS thấp. Tôi tin rằng điều này là do các chỉ số theo thứ tự giảm thiểu việc sử dụng bộ nhớ cache GPU. Thứ tự chỉ số cho phương pháp 3 được sử dụng bộ nhớ đệm GPU cao hơn do đó FPS cao hơn.

Cách sửa đổi/sửa đổi phương pháp 2 để mang lại FPS cao hơn?

+1

Phương pháp đo lường FPS của bạn có tính đến thời gian cần để loại bỏ các đỉnh thừa bằng cách sử dụng lực đẩy không? –

+0

@ m.s. Việc loại bỏ chỉ được thực hiện một lần. Tôi không tìm phương pháp xóa theo thời gian thực.Khi giá trị iso đang được thay đổi, tôi chỉ đơn giản là render lưới thô trong Phương pháp 1. Khi thay đổi là không đổi, sau đó tôi xử lý việc loại bỏ mất khoảng 4 giây. Sau đó tôi chỉ sử dụng VBO/IBO để render lưới. Tôi muốn FPS cao hơn cho lưới này, trong khi chỉ rendering, không khai thác hoặc nén được thực hiện khi tôi đo FPS. – Harish

Trả lời

1

Hai điều có thể giúp:

  • cố gắng để tối ưu hóa việc sử dụng bộ nhớ cache dữ liệu bằng cách đặt các đỉnh xấp xỉ theo thứ tự bạn sẽ vẽ chúng
  • cố gắng để tối ưu hóa post transform cache sử dụng (có một thuật toán để làm điều đó here và triển khai có thể được tìm thấy trên mạng)
+0

Cảm ơn @ Jerem, tôi sẽ thử thuật toán này [Fast Vertex Cache Opt] (https://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html). Sẽ cập nhật về cách nó quay ra. Tôi muốn tìm một số thuật toán sử dụng ít bộ nhớ nhất có thể, vì kích thước mắt lưới của tôi có xu hướng thực sự lớn. – Harish

+0

Đã thử thực thi CPU của thuật toán trên, nó hoạt động nhưng quá chậm. nó mất hơn 12 giây cho lưới 60K, mắt lưới của tôi là lên đến 20M và nó chỉ là không khả thi cho một lưới có kích thước đó. Tìm kiếm giải pháp có khả năng mở rộng với GPU. – Harish

+0

Bạn đã thử sắp xếp các đỉnh theo thứ tự bạn vẽ chúng? – Jerem