2008-09-02 31 views
10

Tôi hiện đang triển khai trình chiếu tia. Kể từ khi raytracing là cực kỳ tính toán nặng và kể từ khi tôi sẽ được nhìn vào lập trình CUDA anyway, tôi đã tự hỏi nếu có ai có bất kỳ kinh nghiệm với việc kết hợp cả hai. Tôi thực sự không thể biết được các mô hình tính toán có phù hợp không và tôi muốn biết điều gì sẽ xảy ra. Tôi có ấn tượng rằng nó không chính xác là một trận đấu được thực hiện trên thiên đàng, nhưng tốc độ tăng dần sẽ tốt hơn là không có gì.raytracing với CUDA

Trả lời

20

Một điều rất cảnh giác trong CUDA là luồng điều khiển phân kỳ trong mã hạt nhân của bạn hoàn toàn hiệu suất KILLS, do cấu trúc của phần cứng GPU bên dưới. GPU thường có khối lượng công việc song song dữ liệu với lưu lượng điều khiển rất chặt chẽ (nghĩa là bạn có vài triệu pixel, mỗi trong số đó (hoặc ít nhất là lớn) sẽ được điều hành bởi chính xác cùng một chương trình đổ bóng, thậm chí là Điều này cho phép họ thực hiện một số tối ưu hóa phần cứng, như chỉ có một bộ nhớ cache đơn, lấy đơn vị, và giải mã logic cho mỗi nhóm 32 chủ đề. Trong trường hợp lý tưởng, đó là phổ biến trong đồ họa, chúng có thể phát cùng một lệnh cho tất cả 32 tập hợp các đơn vị thực thi trong cùng một chu kỳ (được gọi là SIMD hoặc Single-Instruction Multiple-Data) có thể mô phỏng MIMD (Multiple-Instruction) và SPMD (Single-Program) , nhưng khi các chủ đề trong một phân tách đa luồng (SM) phân tách (lấy các đường dẫn mã khác nhau ra khỏi một nhánh), logic vấn đề thực sự chuyển đổi giữa mỗi đường dẫn mã trên chu kỳ theo chu kỳ. Bạn có thể tưởng tượng rằng, trong trường hợp xấu nhất, nơi tất cả các luồng nằm trên các đường dẫn riêng biệt, việc sử dụng phần cứng của bạn chỉ giảm xuống 32 lần, có thể tiêu diệt bất kỳ lợi ích nào bạn có bằng cách chạy trên GPU trên CPU, các chi phí liên quan đến marshalling tập dữ liệu từ CPU, qua PCIe, đến GPU.

Điều đó nói rằng, theo dõi bằng tia, trong khi dữ liệu song song theo một nghĩa nào đó, có luồng điều khiển phân tán rộng rãi cho những cảnh phức tạp vừa phải. Ngay cả khi bạn quản lý ánh xạ một loạt các tia có khoảng cách chặt chẽ mà bạn bỏ ra ngay cạnh nhau trên cùng một SM, dữ liệu và địa phương hướng dẫn bạn có cho lần thoát ban đầu sẽ không giữ được lâu. Ví dụ, hãy tưởng tượng tất cả 32 tia rất mạch lạc nảy ra khỏi một hình cầu.Tất cả chúng sẽ đi theo các hướng khá khác nhau sau khi bị trả lại, và có thể sẽ chạm vào các đồ vật được làm từ các vật liệu khác nhau, với các điều kiện ánh sáng khác nhau, v.v. Mỗi vật liệu và bộ điều kiện ánh sáng, tắc, vv đều có dòng lệnh riêng của nó liên kết với nó (để tính toán khúc xạ, phản xạ, hấp thụ, vv), và do đó nó trở nên khá khó khăn để chạy cùng một luồng lệnh trên một phần đáng kể của các chủ đề trong một SM. Vấn đề này, với trạng thái hiện tại trong mã theo dõi tia, giảm mức sử dụng GPU của bạn theo hệ số 16-32, điều này có thể khiến hiệu suất không được chấp nhận cho ứng dụng của bạn, đặc biệt nếu đó là thời gian thực (ví dụ: trò chơi). Nó vẫn có thể vượt trội so với một CPU ví dụ. một trang trại kết xuất.

Hiện có một lớp mới nổi về các máy gia tốc MIMD hoặc SPMD đang được xem xét trong cộng đồng nghiên cứu. Tôi sẽ xem chúng như những nền tảng logic cho phần mềm, raytracing thời gian thực.

Nếu bạn quan tâm đến các thuật toán liên quan và ánh xạ chúng tới mã, hãy kiểm tra POVRay. Ngoài ra nhìn vào ánh xạ photon, đó là một kỹ thuật thú vị mà thậm chí còn đi một bước gần hơn để thể hiện thực tế vật lý hơn là tia sáng.

9

Nó chắc chắn có thể được thực hiện, đã được thực hiện, và là một chủ đề nóng hiện nay trong số rất nhiều raytracing và Cuda rất kinh nghiệm. Tôi sẽ bắt đầu bằng cách perusing http://www.nvidia.com/object/cuda_home.html

Nhưng về cơ bản nó là vấn đề nghiên cứu. Những người làm tốt nó đang nhận được giấy tờ nghiên cứu được xem xét ngang hàng. Nhưng cũng vào thời điểm này vẫn có nghĩa là kết quả GPU/Cuda tốt nhất là gần như cạnh tranh với các giải pháp tốt nhất trên CPU/đa lõi/SSE. Vì vậy, tôi nghĩ rằng đó là một chút sớm để giả định rằng bằng cách sử dụng Cuda sẽ tăng tốc một ray tracer. Vấn đề là mặc dù theo dõi tia là "lúng túng song song" (như họ nói), nó không phải là loại "cố định đầu vào và đầu ra kích thước" vấn đề mà bản đồ đơn giản để GPU - bạn muốn cây, ngăn xếp, cấu trúc dữ liệu động, vv Nó có thể được thực hiện với Cuda/GPU, nhưng nó phức tạp.

Câu hỏi của bạn không rõ ràng về cấp độ kinh nghiệm hoặc mục tiêu của dự án của bạn. Nếu đây là lần đánh dấu tia đầu tiên của bạn và bạn chỉ đang cố gắng tìm hiểu, tôi sẽ tránh Cuda - nó sẽ khiến bạn mất khoảng 10 lần để phát triển và có thể bạn sẽ không có được tốc độ tốt. Nếu bạn là một lập trình viên Cuda có kinh nghiệm vừa phải và đang tìm kiếm một dự án đầy thách thức và dò tìm tia chỉ là một điều thú vị để học, bằng mọi cách, hãy cố gắng làm điều đó trong Cuda. Nếu bạn đang tạo ra một ứng dụng thương mại và bạn đang tìm kiếm một lợi thế cạnh tranh về tốc độ - tốt, nó có thể là một crap shoot vào thời điểm này ... bạn có thể nhận được một hiệu suất cạnh, nhưng với chi phí phát triển khó khăn hơn và phụ thuộc vào phần cứng cụ thể.

Kiểm tra lại sau một năm, câu trả lời có thể khác sau một thế hệ hoặc hai tốc độ GPU, phát triển trình biên dịch Cuda và trải nghiệm cộng đồng nghiên cứu.

+0

Tôi có một dự án nhỏ xây dựng chương trình chiếu tia đầu tiên và chưa bao giờ thực hiện bất kỳ công việc nào của CUDA nên tôi đang ở vị trí kém để làm bất cứ điều gì tuyệt vời, nhưng trong năm tới tôi đang làm việc với công nghệ GPGPU. Điều này dẫn tôi đến làm quen với CUDA và tôi đã tự hỏi rằng việc mở rộng tôi có thể sử dụng kiến ​​thức này. –

+0

Bạn có chắc chắn nó là một vấn đề song song đáng xấu hổ? Giải quyết để tìm đối tượng phản chiếu tiếp theo và các biến thể trong xử lý vật liệu (như được chỉ ra bởi Matt J) có vẻ như chúng có thể phá vỡ tính song song một cách đáng kể. Nhưng hãy sửa tôi nếu tôi sai. –

4

Nvidia giới thiệu một máy đánh dấu tia trong CUDA tại hội nghị của họ NVision năm nay. Đây là một liên kết đến trang trình bày của họ về nó.

http://www.nvidia.com/object/nvision08-IRT.html

+0

Cảm ơn bạn rất nhiều, điều này thực sự thú vị! –