Чи є якісь переваги для використання процесора замість GPU?


63

Я досліджував процесори та відеокарти, і виявив, що графічні процесори набагато швидші, ніж процесори. Я прочитав у цій статті , 2-річна GPU Nvidia за певних обставин перевищила 3,1 ГГц Core I7 Intel в 14 разів. Якщо GPU настільки швидкі, чому розробники не використовують їх для кожної функції в грі? Чи можливо GPU робити що-небудь, крім графіки?


17
Якщо ви в грі, де ви завантажуєте все на GPU, а ваш процесор майже нічого не робить, ви можете отримати підвищення продуктивності, помістивши частину навантаження на процесор.
Тетрад

3
ваш GPU - це може бути краще, ніж ваш процесор, але я не думаю, що ваша відеокарта краща за вашу материнську плату (і я не буду порівнювати ОС з драйвером lol)
e-MEE

27
GPU is faster than a CPUє помилковим міфом, що багато людей примушують повірити, побачивши орієнтири, засновані на проблемах, спеціально орієнтованих на GPU (цей клас проблем називають "бентежно паралельними проблемами"), дивіться мою відповідь на це питання SuperUser: Чому ми все ще використовуємо ЦП замість GPU?
Лі Лі Раян


5
Одним плюсом є те, що на кожному комп’ютері є процесор :)
Тім Холт

Відповіді:


50

"Я читав, що автомобілі F1 швидші, ніж ті, якими ми їздимо на вулицях ... чому люди тоді не користуються автомобілями F1?" Ну ... Відповідь на це питання проста: автомобілі F1 не можуть зламатися або повертатися так швидко, як це робить більшість автомобілів (найповільніша машина в цьому випадку може обіграти F1). Випадок графічних процесорів дуже схожий, вони гарні при дотриманні прямої лінії обробки, але вони не такі гарні, коли справа стосується вибору різних шляхів обробки.

Програма, виконана в GPU, має сенс, коли вона повинна виконуватися багато разів паралельно, наприклад, коли вам потрібно змішати всі пікселі з текстури A з пікселями з Texture B і помістити їх у Texture C. Це завдання при виконанні в процесор, оброблятиметься приблизно так:

for( int i =0; i< nPixelCount; i++ )
     TexC[i] = TexA[i] + TexB[i];

Але це повільно, коли вам доводиться обробляти багато пікселів, тому GPU замість коду, описаного вище, просто використовує наступний:

     TexC[i] = TexA[i] + TexB[i];

а потім він заповнює всі ядра з цією програмою (по суті, копіюючи програму в ядро), призначаючи значення iдля кожного. Тоді, звідки випливає магія від графічного процесора і змушує всі ядра виконувати програму одночасно , роблячи багато операцій набагато швидше, ніж це могло зробити лінійна програма процесора.

Такий спосіб роботи нормальний, коли ви повинні таким же чином обробити дуже багато невеликих входів, але насправді погано, коли вам доведеться скласти програму, яка може мати умовне розгалуження. Тож тепер давайте подивимось, що робить процесор, коли йдеться про деяку перевірку стану:

  • 1: Виконай програму до першої логічної операції
  • 2: Оцініть
  • 3: Продовжуйте виконувати з адреси адреси пам'яті порівняння (як з інструкцією JNM asm)

Це дуже швидко для процесора як встановлення індексу, але для GPU зробити те саме, це набагато складніше. Оскільки живлення від GPU надходить одночасно з виконання тієї ж інструкції (вони є ядрами SIMD), вони повинні бути синхронізовані, щоб мати можливість скористатися архітектурою чіпа. Необхідність підготувати GPU до роботи з філіями передбачає більш-менш:

  • 1: Створіть версію програми, яка слідує лише за гілкою A, заповніть цей код у всіх ядрах.
  • 2: Виконати програму до першої логічної операції
  • 3: Оцініть всі елементи
  • 4: Продовжуйте обробку всіх елементів, які слідують за гілкою A, запускайте всі процеси, які обрали шлях B (для якого в ядрі немає програми!). Тепер усі ті сердечники, які обрали шлях B, будуть ІДЕЛЬНІ !!
  • 5: Після завершення обробки активуйте версію програми B (відкопіюючи її з буферів пам'яті до невеликої основної пам'яті).
  • 6: Виконати гілку B.
  • 7: Якщо потрібно, змішайте / об'єднайте обидва результати.

Цей метод може відрізнятися залежно від багатьох речей (тобто деяких дуже малихгілки можуть працювати без необхідності цього розрізнення), але тепер ви вже можете зрозуміти, чому розгалуження буде проблемою. Кеші GPU дуже малі, ви не можете просто виконати програму з VRAM лінійним способом, вона повинна копіювати невеликі блоки інструкцій до ядер, які потрібно виконати, і якщо у вас є достатньо гілок, ваш GPU буде здебільшого зупинений, ніж виконувати. будь-який код, який не має сенсу, коли він виникає при виконанні програми, яка слідує лише за однією гілкою, як це робить більшість програм - навіть якщо вони працюють у декількох потоках. Порівняно з прикладом F1, це було б як відкрити гальмівні парашути у кожному куті, а потім вийти з машини, щоб упакувати їх назад всередині автомобіля до наступного кута, де ви хочете повернути знову або знайти червоний семафор (наступний кут ймовірно).

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

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


6
дивна аналогія, але це добре the fastest isn't always the fastest.
Лі Лі Раян

1
Дякую! Я думаю, що це цікава тема, тому що вона пов'язує багато концепцій ігрового програмування з тим, як працює апаратне забезпечення, яке дещо забуто в країні сучасних мов високого рівня. Я хотів би додати ще деякі речі, але написання відповіді зайняло певний час, тому я спробую її оновити пізніше, такі як можливості процесорів у захищеному режимі, швидкість шини пам'яті тощо, але я сподіваюся, що це уточнить деякі технічні недоліки виконання всього в gpu.
Пабло Аріель

6
Аналогія була б набагато кращою, якби вона була точною. Автомобілі F1 володіють величезними гальмівними здібностями, які дозволяють їм підтримувати високу швидкість далі в криву, а не починати гальмувати заздалегідь. Кут на поворотах з високою швидкістю також кращий завдяки високим нахилам, хоча радіус повороту, ймовірно, не підходить для паркувальних місць. Кращими причинами можуть бути відсутність місця для зберігання, дзеркало заднього виду, кондиціонер, круїз-контроль, захист від елементів, пасажирські сидіння, підвіска та просвіт ґрунту для поводження з поганими дорогами або інші інші речі, поширені в пасажирських транспортних засобах.
GargantuChet

5
@Pablo Ariel Я відповідаю на заяву: "Автомобілі F1 не можуть зламатися або повертатися так швидко, як це робить більшість автомобілів". Ви припускаєте, що автомобілі F1 можуть розганятися тільки по прямій лінії, і вони не дуже хороші в поворотах або під час гальмування. Але автомобілі F1 насправді можуть гальмувати набагато швидше, ніж "більшість автомобілів", і чудово справляються при швидкісних поворотах.
GargantuChet

4
Аналогія точніша, якщо ви думаєте в драгстерських, а не автомобілях F1
Agustin Meriles

32

Графічні процесори дуже хороші паралельні завдання. Що чудово ... якщо ви виконуєте паралельні завдання.

Ігри - це приблизно найменш паралельний вид застосування. Подумайте про основний цикл гри. AI (припустимо, що гравець обробляється як особливий випадок AI) повинен реагувати на зіткнення, виявлені фізикою. Тому він повинен працювати після цього. Або принаймні, фізиці потрібно викликати підпрограми AI у межах фізичної системи (що з багатьох причин, як правило, не є хорошою ідеєю). Графіка не може працювати, поки фізика не працює, адже фізика - це те, що оновлює положення об'єктів. Звичайно, AI потрібно запустити і перед візуалізацією, оскільки AI може породити нові об'єкти. Звуки потрібно запускати після управління AI та програвачами

Взагалі ігри можуть поширюватися на себе дуже мало. Графіку можна відкручувати ниткою; ігровий цикл може перенести купу даних у графічну нитку і сказати: render this. Це може зробити кілька базових інтерполяцій, так що основний цикл гри не повинен синхронізуватися з графікою. Звук - ще одна нитка; ігровий цикл говорить "грати в це", і він грається.

Після цього все починає боліти. Якщо у вас є складні алгоритми трасування (наприклад, для RTS), ви можете ввести їх у нитку. Але алгоритми можуть зайняти кілька кадрів, але вони будуть принаймні одночасними. Крім того, це досить важко.

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

Тепер, можливо, вам вдасться пройти "в широку сторону" для деяких операцій. Наприклад, ШІ, як правило, не залежать один від одного. Таким чином, ви могли обробити кілька десятків AI одночасно. Вгору, поки вам фактично не потрібно зробити їх залежними один від одного. Тоді ти в біді. Об'єкти фізики аналогічно незалежні ... якщо тільки між ними не виникає обмеження та / або вони стикаються з чимось. Тоді вони стають дуже залежними.

Крім того, є факт, що GPU просто не має доступу до вводу користувача, що, як я розумію, є важливим для ігор. Тож це потрібно було б забезпечити. Він також не має прямого доступу до файлів або реального способу спілкування з ОС; тож, знову-таки, мав би бути якийсь спосіб цього забезпечити. О, і вся ця обробка звуку? GPU не видають звуки. Таким чином, вони повинні повернутися до процесора, а потім вийти на звуковий чіп.

О, і кодування для GPU - це жахливо. Важко правильно підійти, а те, що є «правильним» для однієї архітектури GPU, може бути дуже, дуже неправильним для іншого. І це навіть не просто перехід з AMD на NVIDIA; що може перейти з GeForce 250 на GeForce 450. Це зміна базової архітектури. І це може змусити ваш код не працювати добре. C ++ і навіть C заборонені; найкраще, що ви отримуєте, це OpenCL, який схожий на C, але без деяких смаків. Як і рекурсія . Правильно: ніяких рекурсій на графічних процесорах.

Налагодження? О, я сподіваюся, що вам не сподобаються функції налагодження IDE, тому що вони точно не будуть доступні. Навіть якщо ви використовуєте GDB, поцілуйте його на прощання. Вам доведеться вдатися до printfналагодження ... зачекайте, printfна GPU немає . Таким чином, вам доведеться записувати в місця пам'яті, щоб ваша програма заглушки процесора прочитала їх назад.

Правильно: ручна налагодження. Удачі в цьому.

Також ті корисні бібліотеки, якими ви користуєтесь на C / C ++? Або, можливо, ви більше .NET хлопець, використовуючи XNA тощо. Або що завгодно. Це не має значення, оскільки ви не можете використовувати жоден із них у графічному процесорі. Ви повинні кодувати все з нуля. А якщо у вас вже є база коду, важко: час переписати весь цей код.

Так що так. Це жахливо насправді робити для будь-якої складної гри. І це навіть не спрацювало, тому що ігри просто не є паралельними, щоб допомогти.


21

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

Я підозрюю, що розробники цього не роблять з різних причин, зокрема:

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

  • Можливо, потрібно записати специфічний для GPU код, і це, ймовірно, внесе додаткову складність у загальне програмування гри (або програми).

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

У відповідь на другу частину вашого запитання: Так, є й інші способи використання. Наприклад, такі проекти, як SETI @ Home (і, ймовірно, інші проекти BOINC), використовують GPU (такі як nVidia) для високошвидкісних складних обчислень:

  Запустіть SETI @ home на своєму NVIDIA GPU
  http://setiathome.berkeley.edu/cuda.php

( Мені подобається ваше запитання, оскільки воно викликає цікаву ідею. )


18

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

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

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

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

Насправді перспективи великі, але коли ви робите гру, а не зламаєте паролі, практичні проблеми у більшості випадків переважують переваги.


6

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

Використовувати процесор з одним потоком дуже просто, використовувати багатопотокові складніше, використовувати багато комп'ютерів з паралельною бібліотекою, оскільки PVM або MPI важко, а використовувати gpu - найскладніше.


4

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

І є ще одна велика причина: GPU розрахований на багатопотокові обчислення. Це означає, що виробники GPU можуть легко додавати ядра, коли вони хочуть збільшити обчислювальну потужність. Але є багато завдань, які неможливо розділити на менші задачі, такі як обчислення n-го числа в ряду Фібоначчі . У цих ситуаціях процесор набагато швидше, оскільки він більш оптимізований для однопотокових завдань.


4

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

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


Аналогія щодо літака є дуже хорошою (+1), але стосовно процесорів, що підтримують різні типи даних, це насправді більше мовна концепція вищого рівня, оскільки процесори (принаймні в просторі Intel), як правило, мають справу з дані в дуже основних формах (наприклад, біти, байти, слова, слова і т. д.). Існує кілька інструкцій з жорсткого циклу сканування або копіювання даних, що закінчується нульовим байтом, але дані в цих примірниках CPU насправді не розпізнаються як певний тип (крім того, що це нульовий відмінений фрагмент даних) в контексті цих циклів).
Рендольф Річардсон

@Randolf: Процесори мають різні інструкції та регістри, які стосуються різних типів даних низького рівня (наприклад, підписані проти неподписані, інтеграли проти плаваючої точки). Це стосується 8086 та справді більшості сучасних архітектур, і це не зовсім безкоштовно.
Kylotan

Я впевнений, що вони все ще роблять багато лінійної обробки в базовій архітектурі. З боку програмування потрібна лише інструкція до графічного процесора, але ядра виконуються не паралельно через їх залежність від іншого обладнання, яке не є паралельним, наприклад, зчитування з пам'яті; можливо, GPU може надати дані в одне ядро ​​на Час.
Пабло Аріель

3

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

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

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


1

Зворотній зв'язок - ще одна причина, з якої я можу придумати час від часу перевагу процесора. Не з точки зору пропускної спроможності (як пропускна здатність GPU> CPU - це не стільки проблема сучасного обладнання), скільки з точки зору зупинки конвеєра. Якщо вам потрібно взяти назад результати обчислень і зробити щось цікаве або корисне з ними, використання GPU не є розумним вибором (в загальному випадку - будуть окремі випадки, коли це може залишатися відповідним), оскільки читання назад завжди вимагатиме GPU зупинить все, що він робить, вимийте всі очікувані команди та дочекайтеся завершення перегляду. Це може знищити продуктивність настільки, що це не тільки знищить переваги використання графічного процесора, але й може бути значно повільнішим.


0

Це стара тема, але ця нещодавно опублікована стаття може відповісти на це питання. У цьому документі, опублікованому в ACM Computing Surveys 2015, видно, що кожен з процесорів та графічних процесорів має свої унікальні переваги, і, отже, цей документ дає можливість перейти від парадигми «CPU-GPU спільних обчислень» до парадигми.

Опитування методів гетерогенних обчислень CPU-GPU

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