Чтобы сузить сферу этого вопроса, давайте рассмотрим проекты только на C / C ++.
Существует целый ряд новых расширений набора команд SIMD для архитектуры x86, хотя, чтобы извлечь из них пользу, разработчик должен перекомпилировать код с соответствующим флагом оптимизации и, возможно, изменить его соответствующим образом.
Поскольку новые расширения набора команд появляются относительно часто, неясно, как можно поддерживать обратную совместимость при использовании преимуществ доступных расширений набора команд.
Получается ли полученное приложение совместимым со старыми моделями процессоров, которые не поддерживают новое расширение набора учреждений? Если да, не могли бы вы рассказать, как реализована такая поддержка?
Исторически, самый Наборы команд x86 были (практически) строгими надмножествами предыдущих наборов. Однако расширение AVX-512 имеет несколько несовместимых друг с другом вариантов, поэтому необходимо соблюдать особую осторожность.
К счастью, компиляторы также становятся умнее. GCC имеет __attribute__((simd))
а также __attribute__((target_clones(...)))
автоматически создавать множественный реализации данной функции, и выберите лучшую во время загрузки на основе того, что поддерживает реальный процессор. (Для более старых версий GCC вы должны были использовать IFUNC вручную … и в древний дни, ld.so будет загружать библиотеки из совершенно отдельного каталога в зависимости от таких вещей, как cmov
).
Новые инструкции процессора требуют нового оборудования для выполнения. Если вы попытаетесь запустить их на старых процессорах, которые не поддерживают эти инструкции, ваша программа завершится с ошибкой неверного кода операции. Иногда ОС справятся с этим условием, но обычно нет.
Чтобы работать с новыми инструкциями, вам нужно либо потребовать, чтобы они поддерживались аппаратно, либо (если выгода достаточно велика) проверять во время выполнения, чтобы увидеть, поддерживаются ли новые необходимые вам инструкции. Если они есть, вы запускаете раздел кода, который использует их. Если это не так, вы запускаете другой раздел кода, который не использует их.
Обычно «обратная совместимость» относится к новой версии чего-то, что работает на старых, существующих и не старых программах с новым.