Геометричні перетворення на процесорі та графічному процесорі


9

Я помітив, що багато 3d програми зазвичай роблять векторні / матричні обчислення, а також геометричні перетворення на процесорі. Хтось знайшов перевагу в переміщенні цих обчислень у вершинні шейдери на GPU?

Відповіді:


3

Взагалі кажучи: Перетворення сітки здійснюються на графічному процесорі. Ви надсилаєте матрицю перетворення до GPU, і шейдер застосовує її до всіх вершин мережі.

Використання графічного процесора для обчислення самої матриці - це інша справа і насправді повільніше на GPU, оскільки існує стільки збережених значень, які змінюються від кадру до кадру, які необхідні для визначення остаточної матриці перетворення. Надсилання цих даних до та від CPU - GPU відбувається повільно. Крім того, на процесорі обчислення робляться один раз, тоді як на GPU вони будуть виконані для кожної вершини.


Написати частину "фактично повільніше на GPU"; це дуже широке твердження. Якщо ви говорите про побудову матриці для кожної вершини на GPU, то продуктивність буде залежати від ваших вузьких місць. Ви отримаєте більш низьку продуктивність лише в тому випадку, якщо на GPU ви прив'язані ALU / регістр, що не обов'язково. Зробити те саме, що відбувається на процесорі, також буде повільніше за цих сценаріїв. Приклад , коли це буде зазвичай робиться на GPU: вершинні шейдер побудувати вершину дотичного простору матриць на літа , щоб зберегти вершину вибірки пропускної здатності. Знову ж таки, залежно від ваших вузьких місць, тому YMMV.
jpaver

Я не можу підкреслити, але цю відповідь слід скасувати. Дуже неправильно говорити "насправді повільніше на GPU".
Адам

3

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

Одне з врахувань - пропускна здатність шини між пристроєм, що генерує геометрію, і пристроєм, що рендерує геометрію.

У типовій сучасній системі ПК процесор знаходиться на одній стороні шини PCIe (http://en.wikipedia.org/wiki/PCI_Express), а GPU - на іншій. Єдиний спосіб передачі даних, що генеруються за кадром, від CPU до GPU (і навпаки) - це через цю шину. Це означає, що ви можете бути обмежені швидкістю передачі цієї шини. Якщо ваша цільова платформа має PCIe 2.x з 16 смугами, у вас є пропускна здатність 8 Гб / с. На практиці передачі через PCIe не є на 100% ефективними, оскільки частина пропускної здатності витрачається на протокол під час ваших передач. Залежно від розміру ваших переказів, ви можете втратити 5-10% своєї пропускної здатності лише на накладні витрати.

напр. З огляду на платформу ПК, на якій працює PCIe 2.x з 16 доріжками, скільки даних ви можете генерувати за кадр для подачі в GPU? Якщо припустити, що ви хочете виконати частоту 60 кадрів в секунду, це означає, що для PCIe 2.x це означає 8 ГБ / 60 = 136 МБ на кадр. Помноживши на деякий (оціночний) 90% -ний коефіцієнт, щоб врахувати накладні комунікації з драйверами та накладні протоколи передачі PCIe, ви можете генерувати близько 120 Мбіт даних на кадр, не обмежуючись пропускною здатністю PCIe 2.x.

Ще одне питання, на який ви повинні відповісти: чи буде генерування цих 120 Мбіт даних легко досяжним за 1/60 секунди на вашому цільовому процесорі? Пам’ятаючи, що вам потрібно виконати ряд інших ігрових завдань на вашому процесорі, ви можете зіткнутися з нестачею часу для створення перетворених даних. Що стосується чистої пропускної здатності ALU, це може обмежити вас на процесорі. Що стосується процесора до системних шин, ви також можете бути обмежені пропускною здатністю (яка варіюється, але становить приблизно ~ 8,5 Гб / с на останніх процесорах).

Гаразд, то з якими факторами можна зробити це більш життєздатним на GPU? Одним із факторів є пропускна здатність пам’яті GPU, яка є пропускною здатністю між графічним процесором та його локальною відеопам'яттю. У сучасних графічних процесорах середнього класу ця пропускна здатність відеопам'яті може досягати 200 Гб / с (так, це 25x пропускна здатність PCIe 2.x). Ще один фактор полягає в тому, що GPU масово паралельний, має сотні ALU і здатний приховати затримку доступу до пам'яті, запускаючи тисячі потоків одночасно.

Всі ці фактори можуть сприяти явній виграші, підштовхуючи більше роботи до GPU, але знову ж таки YMMV залежно від вашої цільової платформи.


1

Що ви маєте на увазі під "сітчастими перетвореннями"? Перетворення геометрії за деяким набором матриць? Більшість ігор сьогодні дозволяють графічному процесору обробляти прості перетворення, шкури тощо. А більшість із них використовуватимуть вершинні шейдери для цього. На деяких платформах у вас немає або шейдери, або є інші переваги робити ці речі на процесорі. Наприклад, на PS3 ви можете зняти деяке навантаження з RSX, дозволивши SPU-апаратам обробляти шкури та трансформації. Якщо ви займаєтеся багатопрохідним освітленням, то зняття шнура на процесорі може бути вигідним, оскільки вам потрібно це зробити лише один раз і подати результати, які потрібно оформити для кожного пропуску. Тож є винятки, але загалом більшість ігор займаються цими справами на графічному процесорі та в шейдерах.

Або ви мали на увазі щось більш фантазійне, як-от використання GPU для загальної векторної математики? У наші дні у нас є графічні процесори загального призначення, які можуть запускати досить загальний код C через такі системи, як CUDA. Можна скористатися цим для важкої векторної математики, і я знаю, що там є програми, які роблять це. Я особисто не маю досвіду з цим особисто.


змінив "перетворення сітки" на "геометричне перетворення", щоб допомогти з'ясувати питання. Я також чекаю на opencl es, які можуть бути доступні вже в наступному році.
zmdat

0

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

Навіть якби ви могли обчислити свої константи, як матриці перетворення кісток, на графічному процесорі за допомогою спеціальної програми ініціалізації, ви, ймовірно, не хотіли б цього робити. GPU дійсно хороший при паралельному виконанні, але має набагато повільнішу тактову частоту.

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

Загальне правило:

  • Послідовна обробка: процесор
  • Паралельна обробка: GPU
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.