ни как не выбирает. выбирает компилятор, в соответствии с параметрами целевой платформы. после компиляции ни какого выбора не происходит. следует учесть что платформы типа .Net, JVM, node.js и браузеры, позволяют писать относительно переносимые программы (и то с ограничениями), но сами виртуальны машины/движки, все равно реализованы под свою платформу на этапе компиляции, и даже могут иметь существенные отличия не только в опциях компилирования, но и в исходном коде для разных платформ
upd
Программа, написанная и скомпилированная один раз, может выполняться на процессорах с разными наборами инструкций и на разных версиях Windows.
такая программа использует не все инструкции процессора, а только гарантированно совместимый набор инструкций. в случае игр, или ПО для проектирования, в комплект поставки могут входить наборы
dll(если мы говорим о винде, или другие способы разбиения на модули), оптимизированных для разных наборов инструкций на этапе компиляции, в том числе для для использования GPU, для достижения максимального быстродействия. в этом случае, какой модуль можно использовать, определяет опять же не вся
вычислительная система
а головная программа (та что на универсальном наборе инструкций). и все это происходит ни коим образом не автоматически, а закладывается на этапе проектирования и реализуется в программном коде. хотя для определения типа процессора и набора инструкций, уже давно существуют стандартизированные api, обычно на уровне ОС