Чому двигуни потрібно оптимізувати для нових процесорів тієї ж архітектури?


39

Коли виходить нова генерація процесорів, більшість веб-сайтів повідомляють, що ігрові двигуни та програми потрібно оптимізувати для нового обладнання. Я не зовсім розумію, чому. Процесор зазвичай має архітектуру, яка визначає, який набір інструкцій він використовує. Ми використовуємо сьогодні amd_x86_64. Чому будь-яку програму чи компілятор потрібно оновлювати, якщо всі процесори використовують ту саму архітектуру? Безумовно, існують особливості В конвеєрі нового процесора, який оптимізує виконання машинного коду, але навіщо сам машинний код потрібно змінювати, якщо архітектура цього не робила?


Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Джош

14
"Потреба" - це неправильне формулювання, і більше маркетинг, ніж правда, майже так само, як, наприклад, Windows має підтримувати певне покоління процесора (або ні, як у випадку з Windows 7, яке, в принципі, працює ідеально добре, наприклад, Ryzen, за винятком використання на 3-4% більше енергії, ніж потрібно). Ця настройка полягає лише у спробі вичавити трохи більше з процесора, наблизившись до максимуму. Реально ви можете отримати загальну кількість 1-2% на прикладах, які не спричиняються, завдяки різному плануванню та використанню пари нових інструкцій.
Деймон

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

Дивіться пов’язане з моїм питанням про переповнення стека: Як насправді працює mtune?
Марк.2377

Відповіді:


54

Тому що різні покоління однієї архітектури можуть мати різні набори інструкцій .

Наприклад, Streaming SIMD Extensions - це, мабуть, найвідоміший набір інструкцій x86, але все ж, і незважаючи на те, що існує лише одна архітектура x86, існують SSE, SSE2, SSE3 та SSE4.

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

Тож якщо ігровий движок буде складено для архітектури попереднього покоління, він не матиме підтримки для цих новіших інструкцій. Так само може знадобитися оптимізація двигуна для отримання нових інструкцій; Наприклад, SSE4 має підтримку інструкцій із крапкового продукту, які працюють на даних масиву структур. Оптимізацією, яка могла б скористатися цими новішими інструкціями, буде змінити макет даних на масив структур.


1
@Panzercrisis - дякую за пропозицію щодо редагування. Щоб було зрозуміло: оригінальне питання стосувалося не власного коду, а коду двигуна, тому "оптимізувати власний код" - це не дуже корисна пропозиція редагувати Однак це підкреслило, що мені потрібно уточнити, що, коли я сказав "оптимізувати", я мав на увазі "оптимізувати код двигуна", тому я відредагував, щоб взяти це за рішення.
Максим Мінімус

37

Відповідь Максимуса правильна, я просто хочу розповісти ще один фрагмент історії:

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

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

  • Нові рівні кешу означають, що вам потрібно більше подумати над тим, як ви організовуєте ще більші набори даних (L1, L2, L3 vs L4).

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

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

  • Кількість FPU в системі більше не може відповідати кількості цілих ALU на ядро ​​(AMD мала / має подібні архітектури).

  • Кількість тактових циклів, необхідних для обчислення операції, зменшилась або збільшилась.

  • Кількість доступних регістрів змінилася.

Все це дуже реально впливає на продуктивність програм, які робили припущення щодо основної архітектури попереднього обладнання з тим самим ISA, як позитивного, так і негативного.


"Підвищений або знижений рівень кешу означає, що вам потрібно менше турбуватися про когерентність кешу." - практично будь-який процесор є послідовним кешем. Ви маєте на увазі помилковий обмін? Навіть практично будь-яка лінія CPU $ майже завжди становить 64 B ...
Мацей П'єхотка

1
Maciej щойно приймав вашу заяву про когерентність кешу :) Ви, мабуть, мали на увазі "оптимізацію кешу" чи щось. Кохерентність кешу - це здатність системи зберігати послідовне уявлення про пам'ять прозоро до програмного забезпечення, навіть за наявності N незалежних кешів. Це абсолютно ортогонально за розміром. Заява TBH не дуже актуальна, але ваша відповідь (особливо пункти 5 і 6) вирішує це питання краще, ніж прийняте ІМО :) Можливо, підкресливши різницю між архітектурою та u-архітектурою, вона зробить її більш виділеною.
Маргарет Блум

4
"на зразок множення, що займає більше часу, ніж додавання, де, як сьогодні, і для сучасних intel та amd CPUS потрібно стільки ж часу". Це не все так. У конвеєрних архітектурах ви повинні розрізняти затримку (коли результат готовий) і пропускну здатність (скільки ви можете зробити за цикл). Крім того, сучасні процесори Intel мають пропускну здатність 4 і затримку 1. Множина має пропускну здатність 1 і затримку 3 (або 4). Це те, що змінюється з кожною архітектурою і потребує оптимізації. Наприклад, pdep1 цикл на Intel, але 6 на Ryzen, тому, можливо, не хочеться використовувати його на Ryzen.
Крістоф

2
@Clearer Я знаю, що ми тут говоримо про процесори, але ви ніколи не програмували GPU? Той самий код дає такі дивовижні результати в продуктивності, що часто ви насправді змушені брати до уваги апаратні можливості в CUDA. Ось, звідки я взяв це, розмір кешу (спільна пам'ять, керований кеш L1) насправді потрібно враховувати, як ви кодуєте щось у CUDA.
whn

2
@Christoph правильний. Тест, на який ви посилаєтеся, стосується циклу через масив c[i] = a[i] OP b[i](тобто 2 завантаження та 1 сховище на одну операцію), тому в часі переважає пропускна здатність пам'яті через дуже низьку обчислювальну інтенсивність. Розмір масиву не відображається таким чином IDK, якщо він відповідає L1D. ( gcc4.9 -Ofastцілком ймовірно, автоматично векторизуються ці петлі, тому ви навіть не вимірюєте вартість звичайних скалярних операцій як частини складного цілого коду). Перший рядок цієї сторінки ВАЖЛИВО: Корисні відгуки показали, що деякі з цих заходів є серйозними помилками. Основне оновлення вже на шляху .
Пітер Кордес

2

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

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

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