簡體   English   中英

Ngen和.net-native可一次創建多少種x86處理器?

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

只要安裝了.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 Native可用的處理器功能。 對於x86,Win8 +要求SSE2可用。

關於MSVCRT的一個有趣的旁注:

.NET將Microsoft Visual C ++運行時用於許多實用程序功能。 C ++運行時內部的某些功能檢查處理器功能,並為不同的處理器執行不同的代碼路徑。 (特別是,我知道x86 memcpy可以做到這一點。)這些檢查在運行時進行,並且代碼可在不同處理器模型之間移植。

簡短的答案: 正好一個

NGen會將IL代碼編譯為平台的本機代碼。 您不應該在計算機之間移動exe文件,因為它是在GAC中為您自己的計算機注冊的,並與其NGen的依賴關系進行了鏈接。 本機映像生成是在目標計算機上執行的。

對於.NET本機,該exe將僅包含一種體系結構的本機代碼,就像經典的編譯器一樣。 如果您需要支持不同的體系結構,則除非使用某種自己的打包機制,否則最終將得到幾個exe文件,但這將不利於.NET本機的目的。

目前, 僅x64和ARM支持.NET native。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM