Hiệu suất vòng lặp trong một shader


11

Tôi tự hỏi cách tốt nhất để tích hợp chức năng vòng lặp động trong trình đổ bóng là gì?

Đầu tiên, dường như các mảng động là không thể. Vì vậy, tốt hơn là tạo một mảng kích thước tối đa và chỉ điền vào một phần của nó hoặc xác định các mảng với kích thước được xác định trước?

Vậy thì, cách tốt nhất để lặp lại mảng này là gì?

Là tốt hơn để sử dụng một vòng lặp không được kiểm soát hoặc một vòng lặp động cho một cái gì đó giữa 4 đến 128 lần lặp? Tôi cũng đã thấy rằng có thể hủy đăng ký nó với số lần lặp được xác định trước tối đa sau đó dừng nó với một điều kiện như if (i == myCurrentMaximumIterationNumber).


2
Bạn đang cố gắng làm gì với mảng và vòng lặp? Tôi đang hỏi bởi vì điều này bằng cách nào đó nghe có vẻ như là một vấn đề XY đối với tôi. Vì cách tốt nhất để sử dụng các điều kiện và vòng lặp trên GPU là không sử dụng chúng, có thể có những cách thậm chí tốt hơn thay vì sử dụng mảng và vòng lặp trong trường hợp của bạn.
Nero

Tôi đang thực hiện một hiệu ứng tán xạ không gian màn hình hiện đang hoạt động. Nhưng tôi có một số nghi ngờ về cách tôi sử dụng kernel theo các màn trình diễn. Tôi đã chọn thực hiện kích thước mảng tối đa và chỉ điền vào một phần và sử dụng vòng lặp động với số lần lặp động có liên quan đến nội dung mảng hiện đang sử dụng. Tôi nghĩ rằng có những điều cần làm hoặc biết khi lập trình shader theo biểu diễn chẳng hạn. Và theo tôi, các vòng lặp là một chủ đề hiệu suất phổ biến có thể tuân theo một số quy tắc và có thể là "thực hành tốt" nhưng tôi không tìm thấy câu trả lời hay nào về nó.
MaT

Câu trả lời:


6

Trình biên dịch Shader cực kỳ tích cực về việc không kiểm soát do CTNH ban đầu thường không có kiểm soát dòng chảy và chi phí cho các CTNH gần đây có thể thay đổi. Nếu bạn có một điểm chuẩn mà bạn đang tích cực kiểm tra và một loạt các phần cứng có liên quan, thì hãy thử mọi thứ để xem điều gì sẽ xảy ra. Vòng lặp động của bạn phù hợp với sự can thiệp của nhà phát triển hơn là vòng lặp tĩnh - nhưng để nó cho trình biên dịch vẫn là lời khuyên tốt trừ khi bạn có sẵn điểm chuẩn. Với một điểm chuẩn, khám phá là đáng giá (và vui vẻ).

BTW, tổn thất lớn nhất với vòng lặp động trên GPU là các "luồng" riêng lẻ trong mặt sóng / sợi dọc sẽ kết thúc vào các thời điểm khác nhau. Các luồng dừng lại sau đó buộc tất cả các chuỗi kết thúc sớm để thực hiện NOP.

Các vòng lặp lồng nhau nên được suy nghĩ cẩn thận thông qua: Tôi đã triển khai một bộ giải mã entropy dựa trên khối mã hóa các chuỗi số không (đối với JPEG như nén). Việc thực hiện tự nhiên là giải mã các bước chạy trong một vòng lặp bên trong chặt chẽ - điều này thường có nghĩa là chỉ có một luồng đang tiến triển; bằng cách làm phẳng vòng lặp và kiểm tra rõ ràng trong từng luồng nếu nó hiện đang giải mã một lần chạy hay không, tôi giữ cho tất cả các luồng hoạt động thông qua vòng lặp có độ dài cố định (các khối được giải mã đều có cùng kích thước). Nếu các luồng giống như các luồng CPU, thì sự thay đổi sẽ rất tệ, nhưng trên GPU tôi đang chạy, tôi đã tăng hiệu suất gấp 6 lần (vẫn còn khủng khiếp - không có đủ khối để giữ GPU bận rộn - nhưng đó là một bằng chứng về khái niệm).

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.