c # — Для скольких типов x86-процессоров Ngen и .net-native создают нативный код одновременно?

Пока установлен .net — я понимаю, что код IL позволяет .net заботиться о разных типах процессоров. Но когда мы рассматриваем собственный код — насколько я понимаю (и, пожалуйста, исправьте меня, если я ошибаюсь) — код должен быть скомпилирован для каждого типа процессора независимо, и «Диспетчер ЦП» в начале исполняемого файла выбирает, какой код будет выполнен — ​​в зависимости от точный тип процессора. Так что будет какой-то «самый простой» код, который будет работать на любой Процессор Intel / AMD, и тогда появятся еще несколько оптимизированных кодов.

Отсюда мой вопрос: сколько версий кода будет создано .net-native, а сколько Ngen? Будет ли у Ngen только одна версия, и даже не самая «простая»? Или он также будет иметь это — так что если он будет скопирован на другой компьютер — он все равно будет работать? Будет ли .net-native иметь много версий — делая исполняемый файл в несколько раз больше его размера? Или большая часть кода одинакова, и только оптимизируемые части написаны для того, для чего они могут быть оптимизированы?

РЕДАКТИРОВАТЬ

Когда я упоминаю «тип процессора» — я не имею в виду: X86 или ARM. Я имею в виду: в х86 (или х64). Такие, как процессоры, поддерживающие MMX, 3DNow !, SSE …

1

Решение

И NGEN, и .NET Native генерируют один набор кода для каждой архитектуры. Они не меняют поведение генерации кода в зависимости от модели процессора пользователя.

В случае с NGEN это может измениться. Будущая версия NGEN может определить модель процессора, поскольку она работает на компьютере конечного пользователя, и сгенерировать лучший код для этой модели.

.NET Native работает как C ++. Весь код генерируется заранее, а не на компьютере пользователя, и поэтому код должен выполняться на каждой поддерживаемой модели процессора. .NET Native работает только на Win8.1 и выше. Итак, минимальные системные требования для Win8.1 определяют возможности процессора, доступные для .NET Native. Для x86 для Win8 + требуется SSE2.

Один интересный отзыв о MSVCRT:

.NET использует среду выполнения Microsoft Visual C ++ для ряда служебных функций. Некоторые функции внутри среды выполнения C ++ делать проверять возможности процессора и выполнять разные пути кода для разных процессоров. (В частности, я знаю, что x86 memcpy делает это.) Эти проверки происходят во время выполнения, и код остается переносимым на разные модели процессора.

2

Другие решения

Краткий ответ: точно один.

NGen скомпилирует код IL в собственный код вашей платформы. Вы не должны перемещать exe-файл между компьютерами, так как он зарегистрирован в GAC для вашего собственного компьютера и связан с его зависимостями NGen. Генерация собственного изображения выполняется на целевой машине.

Что касается нативного .NET, исполняемый файл будет содержать только нативный код для одной архитектуры, как это сделал бы классический компилятор. Если вам нужно поддерживать разные архитектуры, у вас будет несколько exe-файлов, если только вы не создадите какой-то собственный механизм упаковки, но это отчасти побьет цель .NET native.

Прямо сейчас .NET native поддерживается на только x64 и ARM.

0

По вопросам рекламы [email protected]