Chi phí chuyển tham số trong shader pixel webgl?


7

Trong một Shader webgl pixel, tất cả các chức năng đều được sắp xếp như tôi hiểu nó, tuy nhiên bạn có thể có các thông số được đánh dấu là năm so với việc inout có nghĩa là giá trị của chúng có thể thay đổi nhưng giá trị sẽ không tồn tại bên ngoài của cuộc gọi chức năng.

Điều này nghĩa là rằng shader phải tạo một bản sao của các giá trị cho các chức năng để làm việc với khi nó là một trong giá trị?

Là trình biên dịch shader / tối ưu đủ thông minh để biết khi nào họ không cần phải tạo một bản sao, hoặc là nó tốt nhất để thực sự chỉ là đánh dấu tất cả các thông số như inout và chắc chắn và không sửa đổi những cái bạn không muốn thay đổi, nếu hiệu suất là mối quan tâm chính?

Cảm ơn!

Câu trả lời:


6

Kinh nghiệm của tôi khi làm việc với trình biên dịch shader vài năm trước là chúng cực kỳ hung dữ và tôi nghi ngờ bạn sẽ thấy bất kỳ sự khác biệt hoàn hảo nào, nhưng tôi sẽ đề nghị thử nghiệm nhiều nhất có thể.

Tôi thường khuyên bạn nên cung cấp cho trình biên dịch (và người đọc con người) nhiều thông tin hơn trong đó ngôn ngữ cho phép, đánh dấu các tham số theo cách sử dụng của họ. Việc xử lý một tham số chỉ trong như là vào / ra thường dễ bị lỗi hơn so với trình biên dịch.

Một số chi tiết: các shader chạy gần như hoàn toàn bằng cách sử dụng các thanh ghi cho các biến (tôi đã làm việc với các kiến ​​trúc hỗ trợ lên tới 256 thanh ghi 32 bit) - việc đổ tràn rất tốn kém. Các thanh ghi vật lý được chia sẻ giữa các lệnh shader - nghĩ về điều này như các luồng trong ý nghĩa HyperThread chia sẻ một nhóm thanh ghi - và nếu shader có thể được tuân thủ để sử dụng ít thanh ghi hơn thì có sự song song lớn hơn. Kết quả là trình biên dịch shader làm việc rất chăm chỉ để giảm thiểu số lượng thanh ghi được sử dụng - tất nhiên là không bị đổ. Do đó, nội tuyến là phổ biến vì nó mong muốn tối ưu hóa phân bổ đăng ký trên toàn bộ shader.

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.