Là một điều kiện liên tục tốn kém hơn so với chuyển đổi shader?


14

Nói chung, phân nhánh trong shader không phải là một ý tưởng tốt. Nhưng bây giờ tôi có một shader với một điều kiện không đổi đối với toàn bộ lệnh rút thăm. Vì vậy, nhánh được thực hiện luôn giống nhau cho một lệnh gọi.

Là loại phân nhánh như vậy vẫn còn tốn kém hơn so với việc có nhiều shader mà không có các nhánh này và chuyển đổi giữa chúng?



Như câu trả lời giải thích cho câu hỏi của tôi, các mảnh được nhóm thành "sợi dọc" hoặc "mặt sóng" và nếu tất cả các mảnh trong một nhóm như vậy sử dụng cùng một nhánh, chỉ có nhánh đó được thực thi.
Martin Ender

Nhưng những gì về shader khác với mảnh?
nikitablack


1
Tôi nghi ngờ đây không phải là một bản sao, nhưng nó cần được chỉnh sửa để làm rõ những gì đang được hỏi trước đó có thể được xác định. Một số mã ví dụ hoặc giải thích về hai tùy chọn được so sánh sẽ giúp ích rất nhiều.
trichoplax

Câu trả lời:


13

Trên phần cứng hiện đại nếu tất cả các yêu cầu trong một nhóm theo cùng một đường dẫn thì đường dẫn không sử dụng sẽ không được đánh giá.

trong mã giả:

if(cond){
   res = ...
}else{
   res = ...
}

trở thành

if(anyInvocationARB(cond)){
    res1 = ...
}
if(anyInvocationARB(!cond)){
    res2 = ...
}
res = cond?res1:res2;

Trường hợp nào anyInvocationARBsẽ đúng nếu bất kỳ lời gọi nào của trình đổ bóng sẽ có đúng như cond(từ phần mở rộng opengl ARB_shader_group_vote ).

Nếu cond có thể lấy được từ đồng phục một mình thì trình điều khiển có thể tối ưu hóa và đánh giá tình trạng trước khi bắt đầu kết xuất và thay thế if bằng một goto đến nhánh chính xác. OpenGL có một tính năng được gọi là chương trình con thống nhất làm cho nó rõ ràng.


4
Điều này là đúng, nhưng nó không phải là điều duy nhất bạn cần xem xét cho hiệu suất. GPU vẫn lên lịch tĩnh cho tài nguyên trên mỗi shader, vì vậy điều này vẫn có thể là tài nguyên như thể bạn đang thực thi cả hai nhánh, điều này có thể ảnh hưởng đến việc chiếm dụng.
John Calsbeek
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.