Чому в OpenCL заборонена рекурсія?


19

Я хотів би скористатися OpenCL для прискорення візуалізації зображень, що промінюються, але зауважую, що сторінка Вікіпедії стверджує, що в Open CL рекурсія заборонена. Це правда? Оскільки я широко використовую рекурсії під час проходження руху, для цього знадобиться значна кількість перероблень, щоб скористатися швидкістю. Яке основне обмеження запобігає рекурсії? Чи є який-небудь спосіб навколо цього?


2
Графічні процесори працюють по-іншому. (Деякі архітектури) не мають поняття глобального "програмного стеку", тому рекурсивні виклики функцій у них неможливі. OpenCL, ймовірно, приймає найменший загальний знаменник, тим самим забороняючи йому повністю залишатися переносним через GPU. Нові апаратні засоби CUDA , схоже, була введена підтримка рекурсії в якій - то момент: stackoverflow.com/q/3644809/1198654
glampert

Відповіді:


27

По суті, тому, що не всі GPU можуть підтримувати виклики функцій - і навіть якщо вони є, функціональні виклики можуть бути досить повільними або мати такі обмеження, як дуже мала глибина стека.

Код шейдера та обчислювальний код GPU можуть виявлятись функціональними викликами в усьому місці, але за звичайних обставин вони на 100% позначаються компілятором. Машинний код, виконаний графічним процесором, містить гілки та петлі, але не викликає функцій. Однак рекурсивні виклики функцій з очевидних причин не можна накреслити. (Якщо деякі аргументи не є константами часу компіляції, таким чином, щоб компілятор міг їх скласти і встроїти все дерево викликів.)

Щоб реалізувати справжні виклики функцій, вам потрібен стек. Здебільшого шейдерний код взагалі не використовує стек - у графічних процесорах є великі регістрові файли, а шейдери можуть постійно зберігати всі свої дані в регістрах. Важко зробити роботу стеку, тому що (а) вам знадобиться багато місця для стеку, щоб забезпечити всі безлічі перетворень, які можуть бути в польоті одночасно, і (b) система пам’яті GPU оптимізована для спільної сумісної роботи транзакцій з пам'яттю для досягнення високої пропускної здатності, але це відбувається за рахунок затримки, тому я гадаю, що операції стеки, такі як збереження / відновлення локальних змінних, були б жахливо повільними.

Історично виклики функціонального рівня на апаратному рівні не були надто корисними для графічного процесора, тому що було доцільніше вкладати все в компілятор. Тож архітектори GPU не зосереджувались на тому, щоб зробити їх швидкими. Ймовірно, можуть бути здійснені різні компроміси, якщо в майбутньому буде попит на ефективні виклики на апаратному рівні, але (як і все, що стосується техніки) це спричинить витрати десь в іншому місці.

Що стосується променевої стрічки, то, як люди зазвичай поводяться з подібними речами, це створюючи черги променів, які знаходяться в процесі відстеження. Замість того, щоб повторюватись, ви додаєте промінь у чергу, а на високому рівні десь ви маєте цикл, який продовжує обробляти, поки всі черги не будуть порожніми. Однак це вимагає значної реорганізації коду візуалізації, якщо ви починаєте з класичного рекурсивного Raytracer. Для отримання додаткової інформації про це можна прочитати документ Wavefront Path Tracing .


6
Я не хочу ділитися цим секретним соусом, але мені пощастило мати фіксовану максимальну кількість відмов і мати стек фіксованого розміру (і петлю з фіксованою кількістю ітерацій), щоб впоратися з цим. Крім того (і це справжній секретний соус imo!) Мої матеріали є відбиваючими або заломлюючими, але ніколи і те й інше, завдяки чому промені не розщеплюються, коли вони відбиваються. Кінцевим результатом всього цього є рекурсивний тип рентгенівського відображення, але через ітерацію фіксованого розміру, а не рекурсію.
Алан Вулф

Як хвоста рекурсія?
Tanmay Patil

Вам не знадобиться стек для виконання хвостової рекурсії, оскільки хвостово-рекурсивні функції можуть бути перетворені в ітераційні функції. Чи компілятор OpenCL не робить цього автоматично?
Андерсон Грін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.