@XCemaXX

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

Рассмотрим архитектуру x86, ОС Windows.
Программа, написанная и скомпилированная один раз, может выполняться на процессорах с разными наборами инструкций и на разных версиях Windows.
Но как определяется, с помощью какого набора инструкций будет выполнятся эта программа? Т.е. какие исполнительные блоки задействовать.
Из статьи понял, что компилятор добавляет условия, как выполнять программу, согласно наличию наборов инструкций. Исполняемая программа проверяет перед каждым запуском эти условия и выбирает лучшие инструкции из тех, которые есть. Но этот пример для самой ОС. Для программ это работает так же?
Обязательно ли в самом коде программы задавать, что необходимо произвести работу с помощью определенных инструкций? Может ли, например, для быстрой обработки массива данных с плавающей запятой компилятор сам задать использование векторной обработки?
  • Вопрос задан
  • 248 просмотров
Решения вопроса 1
mindtester
@mindtester
https://youtu.be/UtO6HIp1908?list=RDUtO6HIp1908
ни как не выбирает. выбирает компилятор, в соответствии с параметрами целевой платформы. после компиляции ни какого выбора не происходит. следует учесть что платформы типа .Net, JVM, node.js и браузеры, позволяют писать относительно переносимые программы (и то с ограничениями), но сами виртуальны машины/движки, все равно реализованы под свою платформу на этапе компиляции, и даже могут иметь существенные отличия не только в опциях компилирования, но и в исходном коде для разных платформ

upd

Программа, написанная и скомпилированная один раз, может выполняться на процессорах с разными наборами инструкций и на разных версиях Windows.
такая программа использует не все инструкции процессора, а только гарантированно совместимый набор инструкций. в случае игр, или ПО для проектирования, в комплект поставки могут входить наборы dll(если мы говорим о винде, или другие способы разбиения на модули), оптимизированных для разных наборов инструкций на этапе компиляции, в том числе для для использования GPU, для достижения максимального быстродействия. в этом случае, какой модуль можно использовать, определяет опять же не вся
вычислительная система
а головная программа (та что на универсальном наборе инструкций). и все это происходит ни коим образом не автоматически, а закладывается на этапе проектирования и реализуется в программном коде. хотя для определения типа процессора и набора инструкций, уже давно существуют стандартизированные api, обычно на уровне ОС
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
vaut
@vaut
Обязательно ли в самом коде программы задавать, что необходимо произвести работу с помощью определенных инструкций?

Нет, в коде это указывать не обязательно, компилятор производит оптимизации сам.

Может ли, например, для быстрой обработки массива данных с плавающей запятой компилятор сам задать использование векторной обработки?

Все так и происходит.

Далее немного о том как устроен наш суровый мир.
1) При исполнении код не изменяется, какие инструкции компилятор указал делать те и исполняются.
2) При компиляции указывается совместимость с какими архитектурами требуется, исходя из этого используется разный набор инструкций.
3) Ну и как следствие для совместимости бинарники распространяются собранные с целевой древней архитектурой и новые инструкции не используются. Ну почти так. Иногда в местах с высоким требованием к скорости работы разработчики заморачиваются и делают так что исполняется код для вашей архитектуры со всеми оптимизациями.
Ответ написан
@stul5tul
Как выбирает процессор? Процессор может быть в каком-то или другом режиме работы. Но это используется только на уровне ОС и это не то, что вы имели ввиду.

То что имели ввиду вы - выбирает не процессор, а выбирает сама программа. Там определяются возможности процессора и выбирается та или иная ветка алгоритма - с инструкциями для того или иного вида процессора.

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


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

А еще есть .NET - программа изначально скомпилирована в код не зависящий от никакого процессора.

Исполняемая программа проверяет перед каждым запуском эти условия и выбирает лучшие инструкции из тех, которые есть. Но этот пример для самой ОС. Для программ это работает так же?

Так работает прежде всего именно для прикладных программ.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы