Почему двигатели должны быть оптимизированы для новых процессоров той же архитектуры?

Когда выпущено новое поколение процессоров, большинство веб-сайтов сообщают, что игровые движки и программы должны быть оптимизированы для нового оборудования. Я не совсем понимаю, почему. Процессор обычно имеет архитектуру, которая определяет, какой тип набора команд он использует. В настоящее время мы все используем amd_x86_64. Почему любая программа или компилятор должна быть обновлена, если все процессоры используют эту же архитектуру? Разумеется, есть функции, СВЯЗАННЫЕ С конвейером нового процессора, который оптимизирует выполнение машинного кода, но почему сам код машины должен быть изменен, если архитектура не была?

40 голосов | спросил salbeira 18 MonEurope/Moscow2017-12-18T14:19:42+03:00Europe/Moscow12bEurope/MoscowMon, 18 Dec 2017 14:19:42 +0300 2017, 14:19:42

3 ответа


55

Поскольку разные поколения одной и той же архитектуры могут иметь разные наборы команд .

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

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

Итак, если игровой движок скомпилирован для предыдущего поколения архитектуры, он не будет поддерживать эти новые инструкции. Точно так же может потребоваться оптимизация двигателя для новых инструкций; SSE4 , например, поддерживает инструкции для точечных продуктов, которые работают с данными массива-структуры. Оптимизация, которая могла бы использовать эти новые инструкции, заключалась бы в том, чтобы изменить макет данных на массив-структуры.

ответил Maximus Minimus 18 MonEurope/Moscow2017-12-18T15:52:42+03:00Europe/Moscow12bEurope/MoscowMon, 18 Dec 2017 15:52:42 +0300 2017, 15:52:42
38

Ответ Максимуса правильный, я просто хочу дать еще одну часть истории:

Аппаратное обеспечение изменяется так, как вам нужно изменить код, независимо от введенных инструкций.

  • Увеличение или уменьшение количества кеша означает, что вам нужно меньше или меньше беспокоиться о том, что проблема кэширования /кэширования не является проблемой. Больше средств кэширования с небольшими данными можно сфокусировать на том, чтобы убедиться, что данные смежны, и не справляются с проблемами производительности. Меньший кеш означает, что это может быть проблемой, и очень мало кеш-памяти с некоторыми большими структурами данных, это не имеет никакого значения.

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

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

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

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

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

  • Изменено количество доступных регистров.

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

ответил snb 18 MonEurope/Moscow2017-12-18T19:10:46+03:00Europe/Moscow12bEurope/MoscowMon, 18 Dec 2017 19:10:46 +0300 2017, 19:10:46
2

Даже после больших изменений, таких как поддержка новых инструкций, производители микропроцессоров постоянно изменяют свои проекты для повышения производительности, и каждый новый дизайн может иметь разную производительность relative для каждой команды или техники. Возможно, вы написали некоторый тщательно оптимизированный нераспространяемый код для модели X, но модель Y имеет улучшенный ветвь-предиктор, который уменьшает штраф за неправильное предсказание для неинвазивной версии кода (который также освобождает регистр, который будет использоваться где-то в другом месте) , Может быть, модель Y поддерживает больший параллелизм определенной команды с высокой задержкой, так что теперь развернутый цикл этой команды получает лучшую пропускную способность, тогда как в модели X более короткая последовательность была лучше.

Любая проблема может быть решена по-разному, и каждая программа представляет собой взаимосвязанный набор компромиссов и распределения ресурсов с точки зрения оптимизации. Даже небольшие изменения в доступности этих ресурсов или стоимость данного фрагмента кода с точки зрения этих ресурсов могут иметь каскадный эффект, который дает существенное преимущество в производительности для одного фрагмента кода. Даже если обновленный чип имеет «больше всего», то как much больше каждой вещи может качать баланс.

ответил hobbs 20 WedEurope/Moscow2017-12-20T06:05:12+03:00Europe/Moscow12bEurope/MoscowWed, 20 Dec 2017 06:05:12 +0300 2017, 06:05:12

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132