Когда выпускается новое поколение процессоров, большинство веб-сайтов сообщают, что игровые движки и программы должны быть оптимизированы для нового оборудования. Я не совсем понимаю, почему. Процессор обычно имеет архитектуру, которая определяет, какой тип набора команд он использует. В настоящее время мы все используем amd_x86_64. Зачем обновлять какую-либо программу или компилятор, если все процессоры используют одну и ту же архитектуру? Конечно, есть функции В конвейере нового процессора, который оптимизирует выполнение машинного кода, но зачем самому машинный код менять, если архитектура этого не делает?
39
Ответы:
Потому что разные поколения одной и той же архитектуры могут иметь разные наборы команд .
Например, потоковые SIMD-расширения , вероятно, являются наиболее известным набором команд x86, но, тем не менее, несмотря на то, что существует только одна архитектура x86, существуют SSE, SSE2, SSE3 и SSE4.
Каждое из этих поколений может включать новые инструкции, которые обеспечивают более быстрые способы выполнения определенных операций. Примером, который может иметь отношение к играм, могут быть инструкции по точечному продукту.
Поэтому, если игровой движок скомпилирован для архитектуры предыдущего поколения, он не будет поддерживать эти новые инструкции. Точно так же может быть необходимо оптимизировать движок для более новых инструкций; SSE4 , например, имеет поддержку инструкций точечного продукта, которые работают с данными массива структур. Оптимизация, которая могла бы использовать преимущества этих более новых инструкций, состояла бы в том, чтобы изменить макет данных на массив структур.
источник
Максимус ответил правильно, я просто хочу рассказать еще одну часть истории:
Само оборудование меняется так, как вам нужно изменить, как вы кодируете, независимо от вновь введенных инструкций.
Увеличенный или уменьшенный объем кэша означает, что вам нужно меньше или больше беспокоиться о том, что проблемы с оптимизацией / аннулированием кэша являются проблемами. Больше кеша означает, что с небольшими данными вы можете меньше сосредоточиться на том, чтобы убедиться, что данные соприкасаются с проблемами производительности. Меньшее количество кеша означает, что это может быть проблемой, а очень маленький кеш означает, что с некоторыми большими структурами данных это не будет иметь никакого значения.
Новые уровни кэша означают, что вам нужно больше думать о том, как вы организуете еще большие наборы данных (L1, против L2, против L3 против L4).
Больше ядер означает, что вам нужно подумать о том, как вы собираетесь лучше использовать многопоточные приложения и как ваше приложение масштабируется в многопроцессорной среде.
Более быстрые часы означают, что вам нужно больше думать о задержке памяти, чем думать о скорости вычислений ЦП как о узком месте вашей системы.
Количество FPU в системе больше не может соответствовать количеству целочисленных ALU на ядро (AMD имела / имеет подобные архитектуры).
Количество тактов, необходимое для вычисления операции, может быть уменьшено или увеличено.
Количество доступных регистров изменилось.
Все это оказывает очень реальное влияние на производительность программ, которые делали предположения о базовой архитектуре на предыдущих аппаратных средствах с тем же ISA, либо положительным, либо отрицательным.
источник
pdep
для Intel требуется 1 цикл, а для Ryzen - 6, поэтому, возможно, вы не захотите использовать его на Ryzen.c[i] = a[i] OP b[i]
(то есть 2 загрузки и 1 хранилище на операцию), поэтому во времени преобладает пропускная способность памяти из-за очень низкой вычислительной интенсивности. Размер массива не показан, поэтому IDK, если он умещается в L1D. (gcc4.9 -Ofast
очень вероятно, что эти циклы автоматически векторизованы, так что вы даже не измеряете стоимость обычных скалярных операций как часть сложного целочисленного кода). Первая строка этой страницы ВАЖНА: Полезные отзывы показали, что некоторые из этих мер серьезно ошибочны. Важное обновление уже в пути .Даже помимо серьезных изменений, таких как поддержка новых инструкций, производители микропроцессоров постоянно модифицируют свои конструкции для повышения производительности, и каждая новая конструкция может иметь различную относительную производительность для каждой инструкции или техники. Может быть, вы написали некоторый тщательно оптимизированный код без ветвей для Model X, но Модель Y имеет улучшенный предсказатель ветвлений, который уменьшает штраф за неправильное предсказание для версии кода без ветвей (что также освобождает регистр для использования в другом месте) , Возможно, модель Y поддерживает больший параллелизм определенной инструкции с высокой задержкой, так что теперь развернутый цикл этой инструкции обеспечивает лучшую пропускную способность, в то время как в модели X более короткая последовательность была лучше.
Любая проблема может быть решена разными способами, и каждая программа представляет собой взаимосвязанный набор компромиссов и распределения ресурсов с точки зрения оптимизации. Даже небольшие изменения в доступности этих ресурсов или стоимости данного фрагмента кода с точки зрения этих ресурсов могут иметь каскадный эффект, который дает существенное преимущество в производительности тому или иному фрагменту кода. Даже если модернизированный чип имеет «больше всего», как гораздо больше каждую вещь может качнуть баланс.
источник