Например, можно ли иметь исполняемый файл, который использует функции для процессоров Core 2, а затем выборочно использовать другие функции для более старых процессоров? Или это требование для компиляции другого исполняемого файла? И если нет, верно ли это для всех случаев?
3 ответа
Это вполне возможно, в зависимости от того, на какие функции вы ссылаетесь, подход немного отличается.
Например, для математического приложения вы можете определить количество процессоров и / или ядер, а затем заставить каждое ядро обрабатывать различные части вычислений. Сложнее всего убедиться, что данные являются синхронными или асинхронными в зависимости от поставленной задачи.
И, как указывалось ранее, такие вещи, как MMX, можно проверить SSE2, а затем запустить через разные пути кода, что-то вроде:
if (CPU.Supports SSE2) {then use SSE2 Libraries}
else if (CPU.Supports SSE) {Then use SSE Libraries}
else {use pre-SSE LIbraries}
Кроме того, для таких вещей, как architechture (x86 против x64), есть несколько способов, которые могут быть обработаны. Если вы используете JAVA или C #, например, JIT-компилятор может оптимизировать код для любой архитектуры при запуске приложения, он, вероятно, не так быстр, как нативное и хорошо оптимизированное приложение C++, но компромисс в том, что с C++ у вас будет иметь версию x64 и x86 отдельно.
У вас может быть один исполняемый файл, который во время выполнения определяет, какой процессор используется, а затем выбирает лучший способ их использования. Ofc. каждый из этих «лучших способов» предварительно компилируется. Таким образом, вы в основном используете программу, которая была подготовлена для оптимального использования нескольких выборочных наборов процессоров / инструкций.
Есть не так много программ, которые, кажется, делают это, или, по крайней мере, не так много, которые говорят пользователю об этом. Тем не менее, есть по крайней мере несколько из них, например, исполняемый файл dnetc .
Если хотите, вы можете сравнить его с книгой или листовкой с указанием:
страница 10-20: английский
страница 21-42: голландский
страница 43-54: американский английский
страница 55-70: датский
...
Вам придется писать на соответствующем наборе языков / инструкций для каждого из них.
Ядро Linux использует страшные методы, такие как исправление работающего ядра, чтобы выбрать лучший алгоритм для некоторых часто используемых функций.