Các GPU đã từng hỗ trợ các hướng dẫn từng đoạn như MIN
và MAX
lâu hơn nhiều so với chúng đã hỗ trợ phân nhánh có điều kiện tùy ý. Một ví dụ về điều này trong OpenGL trên máy tính để bàn là phần mở rộng GL_ARB_fragment_program
(hiện được thay thế bởi GLSL), tuyên bố rõ ràng rằng nó không hỗ trợ phân nhánh, nhưng nó cung cấp hướng dẫn cho MIN
và MAX
cũng như một số hướng dẫn có điều kiện khác.
Tôi rất tự tin rằng tất cả các GPU vẫn sẽ có phần cứng chuyên dụng cho các hoạt động này được cung cấp cách phổ biến min()
, max()
và clamp()
nằm trong trình đổ bóng. Điều này không được đảm bảo bởi đặc điểm kỹ thuật bởi vì việc triển khai có thể tối ưu hóa mã tuy nhiên nó thấy phù hợp, nhưng trong thế giới thực, bạn nên sử dụng các hàm dựng sẵn của GLSL thay vì cuộn của riêng bạn.
Ngoại lệ duy nhất sẽ là nếu điều kiện của bạn được sử dụng để tránh một số lượng lớn xử lý phân đoạn bổ sung. Tại một thời điểm nào đó chi phí của chi nhánh sẽ thấp hơn chi phí chạy tất cả mã trong chi nhánh, nhưng số dư ở đây sẽ rất phụ thuộc phần cứng và bạn phải chuẩn bị để xem liệu nó có thực sự giúp ích cho ứng dụng của bạn hay không phần cứng mục tiêu. Dưới đây là các loại điều tôi muốn nói là:
void main() {
vec3 N = ...;
vec3 L = ...;
float NDotL = dot(N, L);
if (NDotL > 0.0)
{
// Lots of very intensive code for an awesome shadowing algorithm that we
// want to avoid wasting time on if the fragment is facing away from the light
}
}
Chỉ cần kẹp NDotL
đến 0-1 và sau đó luôn chế biến mã bóng trên mỗi đoạn chỉ để nhân thông qua hạn bóng cuối cùng của bạn bởi NDotL
được rất nhiều nỗ lực lãng phí nếu NDotL
ban đầu là < = 0 và chúng tôi về mặt lý thuyết có thể tránh được chi phí này bằng chi nhánh. Lý do loại điều này không phải luôn luôn là một chiến thắng hiệu suất là nó rất phụ thuộc vào cách phần cứng thực hiện phân nhánh đổ bóng.
Nguồn
2013-07-26 04:31:45
Tôi nghĩ câu cuối cùng của bạn đã được trả lời khá tốt. Ngoài việc tìm kiếm được sắp xếp hợp lý hơn, chúng ít có khả năng được thực hiện bởi các hướng dẫn phần cứng nhanh hơn một 'if' đơn giản. Và ngoài đề xuất chung này (mà nên là đã đủ, mặc dù), trong thực tế nó thực sự là khá có khả năng rằng họ sử dụng hướng dẫn phần cứng đặc biệt hoặc bài tập có điều kiện và không chỉ là chức năng gói 'if's. –