对于多少种类型的 x86 处理器,Ngen 和 .net 本机一次创建本机代码

For how many types of x86-processors do Ngen and .net-native create native code at once?

本文关键字:本机 net 创建 一次 Ngen 本机代码 处理器 多少 于多少 种类 类型      更新时间:2023-10-16

只要安装了.net-我知道IL代码只是让.net处理不同类型的CPU。但是当我们考虑本机代码时 - 据我所知(如果我错了,请纠正我) - 代码必须独立地针对每种处理器类型进行编译,可执行文件开头的"CPU 调度程序"选择将执行的代码 - 取决于确切的 CPU 类型。因此,将有一些"最简单的"代码可以在任何Intel/AMD CPU上运行,然后会有一些更优化的代码。

因此,我的问题是:.net-native将创建多少个版本的代码,Ngen将创建多少个版本?Ngen 会只有一个版本,甚至没有"最简单的"版本吗?或者它也会有这个 - 这样如果复制到另一台机器上 - 它仍然可以工作?.net-native 会有很多版本吗 - 使可执行文件的大小是可能的几倍?或者大多数代码是否相同,只有为可以优化的内容编写的可优化部分?

编辑

当我提到"处理器类型"时 - 我的意思不是:X86 或 ARM。我的意思是:在 x86(或 x64)。如支持MMX,3DNow!,SSE的处理器...

NGEN 和 .NET Native 都会为每个体系结构生成一组代码。它们不会根据用户处理器的模型更改代码生成行为。

在NGEN的情况下,这可能会改变。NGEN 的未来版本可以检测处理器模型,因为它在最终用户的机器上运行,并为该模型生成最佳代码。

.NET Native 的工作方式类似于C++。所有代码都是预先生成的,而不是在用户的计算机上生成的,因此代码需要在每种受支持的处理器型号上运行。.NET Native 只能在 Win8.1 及更高版本上运行。因此,Win8.1 的最低系统要求定义了可用于 .NET 本机的处理器功能。对于 x86,Win8+ 需要 SSE2 可用。

关于MSVCRT的一个有趣的旁注:

.NET 将Microsoft Visual C++ 运行时用于许多实用工具函数。C++运行时中的某些函数检查处理器功能,并为不同的处理器执行不同的代码路径。(特别是,我知道x86 memcpy可以做到这一点。这些检查在运行时进行,并且代码在不同的处理器型号之间保持可移植性。

简短的回答:正好是一个

NGen 会将 IL 代码编译为平台的本机代码。您不应该在计算机之间移动 exe 文件,因为它已在 GAC 中为您自己的计算机注册,并链接到其 NGen'd 依赖项。本机映像生成在目标计算机上执行。

至于 .NET 本机,exe 将仅包含一个体系结构的本机代码,就像经典编译器一样。如果您需要支持不同的体系结构,则最终会得到多个exe文件,除非您创建自己的打包机制,但这会破坏.NET本机的目的。

目前,.NET 本机仅在 x64 和 ARM 上受支持。