2010-01-10 72 views
7

Tôi đang viết thư viện đồ họa của riêng mình (yep, bài tập về nhà của nó :) và sử dụng cuda để làm tất cả hiển thị và tính toán nhanh.Vẽ hình tam giác với CUDA

Tôi gặp vấn đề với vẽ hình tam giác đầy. Tôi đã viết nó theo cách mà một quá trình vẽ một hình tam giác. Nó hoạt động khá tốt khi có rất nhiều hình tam giác nhỏ trong cảnh, nhưng nó phá vỡ hiệu suất hoàn toàn khi hình tam giác lớn.

Ý tưởng của tôi là thực hiện hai lần. Trong lần đầu tiên tính toán chỉ tab với thông tin về scanlines (vẽ từ đây đến đó). Đây sẽ là tam giác cho mỗi quá trình tính toán như trong thuật toán hiện tại. Và trong lần truyền thứ hai, hãy vẽ các đường quét với nhiều quá trình trên mỗi tam giác.

Nhưng nó có đủ nhanh không? Có lẽ có một số giải pháp tốt hơn?

Trả lời

3

Bạn có thể kiểm tra số blog: Đường ống dựng phần mềm trong CUDA. Tôi không nghĩ đó là cách tối ưu để làm điều đó, nhưng ít nhất tác giả chia sẻ một số nguồn hữu ích.

Thứ hai, hãy đọc paper: Cấu trúc lập trình song song có thể lập trình này.Tôi nghĩ đó là một trong những bài báo gần đây nhất và nó cũng dựa trên CUDA.

Nếu tôi có để làm điều này, tôi sẽ đi với một Rasterization Pipeline dữ liệu song song như trong Larrabee (đó là TBR) hoặc thậm chí Reyes và thích ứng với nó để CUDA:

http://www.ddj.com/architect/217200602 http://home.comcast.net/~tom_forsyth/larrabee/Standford%20Forsyth%20Larrabee%202010.zip (thấy phần thứ hai của bài trình bày)

http://graphics.stanford.edu/papers/mprast/

0

Tôi nghi ngờ rằng bạn có một số quan niệm sai lầm về CUDA và cách sử dụng CUDA, đặc biệt khi bạn tham khảo "quy trình" khi nào, trong thuật ngữ CUDA, không có điều gì như vậy. Đối với hầu hết các ứng dụng CUDA, có hai điều quan trọng để đạt được hiệu suất tốt: tối ưu hóa truy cập bộ nhớ và đảm bảo mỗi sợi CUDA 'hoạt động' trong một sợi dọc thực hiện cùng một thao tác cùng lúc với các chuỗi hoạt động otehr trong sợi dọc. Cả hai âm thanh này đều quan trọng đối với ứng dụng của bạn.

Để tối ưu hóa quyền truy cập bộ nhớ của bạn, bạn muốn đảm bảo rằng số lần đọc của bạn từ bộ nhớ chung và ghi vào bộ nhớ chung được kết hợp. Bạn có thể đọc thêm về điều này trong hướng dẫn lập trình CUDA, nhưng về cơ bản nó có nghĩa là các chuỗi liền kề trong một nửa dọc phải đọc từ hoặc ghi vào các vị trí bộ nhớ lân cận. Ngoài ra, mỗi thread nên đọc hoặc ghi 4, 8 hoặc 16 byte cùng một lúc.

Nếu mẫu truy cập bộ nhớ của bạn là ngẫu nhiên, bạn có thể cần xem xét sử dụng bộ nhớ kết cấu. Khi bạn cần phải tham khảo bộ nhớ đã được đọc bởi các chủ đề khác trong một khối, sau đó bạn nên sử dụng bộ nhớ chia sẻ.

Trong trường hợp của bạn, tôi không chắc chắn dữ liệu đầu vào của bạn là gì, nhưng ít nhất bạn cũng nên đảm bảo rằng các bài viết của bạn được kết hợp. Bạn có thể sẽ phải đầu tư một số nỗ lực không tầm thường để có được đọc của bạn để làm việc hiệu quả.

Đối với phần thứ hai, tôi khuyên bạn nên mỗi chuỗi CUDA xử lý một pixel trong hình ảnh đầu ra của bạn. Với chiến lược này, bạn nên xem các vòng lặp trong hạt nhân của bạn sẽ thực thi dài hơn hoặc ngắn hơn tùy thuộc vào dữ liệu trên mỗi luồng. Mỗi sợi trong warps của bạn nên thực hiện cùng một số bước trong cùng một thứ tự. Ngoại lệ duy nhất cho điều này là không có hình phạt thực sự thực sự để có một số chủ đề trong một sợi dọc thực hiện không có hoạt động trong khi các chủ đề còn lại thực hiện cùng một hoạt động với nhau.

Vì vậy, tôi khuyên bạn nên kiểm tra từng chuỗi nếu pixel của nó nằm bên trong một hình tam giác đã cho. Nếu không, nó không nên làm gì cả. Nếu có, nó sẽ tính toán màu đầu ra cho pixel đó.

Ngoài ra, tôi đặc biệt khuyên bạn nên đọc thêm về CUDA vì dường như bạn đang nhảy sâu vào cuối mà không hiểu rõ về một số nguyên tắc cơ bản cơ bản.

+1

Xin lỗi về ngôn ngữ của tôi, tiếng Anh không phải là ngôn ngữ gốc của tôi. Vậy thuật ngữ thích hợp để xử lý trên cạc đồ họa là gì? Vâng, tôi nghĩ rằng tôi hiểu CUDA khá tốt, nhưng có, tôi đã thiếu kiến ​​thức trong các thuật toán song song. Đầu vào của tôi được thiết lập của đỉnh trong không gian cắt, và tôi đã phải vẽ hình tam giác. Tôi nghĩ thuật toán trong đó mọi pixel nên kiểm tra mọi hình tam giác sẽ không được tối ưu. – qba

+0

Tránh mọi điểm ảnh kiểm tra mỗi tam giác có thể được thực hiện bằng cách phân vùng các tam giác của bạn bằng cách sử dụng BVH, KD-Tree hoặc R-Tree. – whatnick

-1

không được thô lỗ, nhưng không phải là những gì card đồ họa được thiết kế để làm không? Có vẻ như việc sử dụng các API OpenGL và Direct3D chuẩn sẽ có ý nghĩa hơn.

Tại sao không sử dụng API để thực hiện hiển thị cơ bản của bạn, thay vì CUDA, cấp thấp hơn nhiều? Sau đó, nếu bạn muốn thực hiện các thao tác bổ sung không được hỗ trợ, bạn có thể sử dụng CUDA để áp dụng chúng trên đầu trang. Hoặc có thể thực hiện chúng như là shaders.

+0

Có, có thực sự. Nhưng mục tiêu của anh ở đây là xây dựng một đường dẫn rasterization đồ họa KHÔNG CÓ các API truyền thống. Hãy suy nghĩ về nó như là một bằng chứng về khái niệm hoặc dự án mục đích giáo dục. – Stringer

+0

Có dự án của nó cho các nghiên cứu của tôi. Chúng tôi phải tự mình làm tất cả. Hầu hết mọi người sử dụng CPU, nhưng tôi quyết định sử dụng CUDA. – qba

+0

Hmm, trong trường hợp đó, nó giống như một dự án thú vị. Loại cách tiếp cận ngược lại, nhưng thú vị. – BobMcGee

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