как известно, с новыми поколениями процессоров добавляются новые расширения, причем у AMD и Intel не совсем совпадают.
Однако, я как-то не встречал софта, который не запускается, к примеру на Intel 2-го поколения под Windows.
С другой стороны, игры для Sony PS4 используют расширения AMD, которых нет в Intel.
Как это вообще разруливается? Выполняются разные куски кода в зависимости от capabilities процессора, или просто компилируют код с наиболее общим набором команд?
Здравствуйте, wl., Вы писали:
wl.>как известно, с новыми поколениями процессоров добавляются новые расширения, причем у AMD и Intel не совсем совпадают. wl.>Однако, я как-то не встречал софта, который не запускается, к примеру на Intel 2-го поколения под Windows. wl.>С другой стороны, игры для Sony PS4 используют расширения AMD, которых нет в Intel. wl.>Как это вообще разруливается?
Самый простой вариант OpenCL. Он компилирует под целевую платформу по месту.
В линухе когда собирается из исходников, посто указывают -march=native, а там если есть оптимизации под конкретное железо, то используется оно (например)
wl.> Выполняются разные куски кода в зависимости от capabilities процессора, или просто компилируют код с наиболее общим набором команд?
либо оптимизированные функции под разные архитектуры и fallback на обычные. Но если платформа 64бит, оно как бы намекает что хотя бы SSE2 будет.
Здравствуйте, wl., Вы писали:
wl.>Как это вообще разруливается? Выполняются разные куски кода в зависимости от capabilities процессора, или просто компилируют код с наиболее общим набором команд?
Да давно уже доступна компиляция с опциональной поддержкой фич (у того же ICC есть /Qax<keyword>, например /QaxAVX).
При старте проги по CPUID выясняется какие опции поддерживаются и выставляются внутренние флаги по которым в критичных местах есть бранч на 2 или более веток кода: generic и оптимизированные под конкретный набор фич.
Здравствуйте, wl., Вы писали:
wl.>как известно, с новыми поколениями процессоров добавляются новые расширения, причем у AMD и Intel не совсем совпадают. wl.>Однако, я как-то не встречал софта, который не запускается, к примеру на Intel 2-го поколения под Windows.
потому что нормальный софт содержит несколько версий кода, оптимизированный под конкретную архитектуру + одну общую. В рантайме определяется тип железа и настраивается выполнение одной из этих веток. В самом хреновом случае будет работать generic ветка, самая тормозная.
Здравствуйте, wl., Вы писали:
wl.>как известно, с новыми поколениями процессоров добавляются новые расширения, причем у AMD и Intel не совсем совпадают. wl.>Однако, я как-то не встречал софта, который не запускается, к примеру на Intel 2-го поколения под Windows. wl.>С другой стороны, игры для Sony PS4 используют расширения AMD, которых нет в Intel. wl.>Как это вообще разруливается? Выполняются разные куски кода в зависимости от capabilities процессора, или просто компилируют код с наиболее общим набором команд?
И то, и другое, и третье.
1. Можно компилировать в безопасное подмножество.
2. Можно вкрячивать в мелкогранулярные функции ветвления по CPUID
3. Можно собирать относительно крупные блоки кода (вплоть до целой DLL) под конкретную архитектуру, и при запуске приложения выбирать, что грузить
4. Можно вообще выполнять JIT-компиляцию, опираясь на отдельные фичи процессора (или, теоретически, на тайминги конкретных команд.