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