...">
瀏覽量:144次
win10專業(yè)版激活指令,windows10指令集
在我之前的博客文章“問題:軟件實際上使用新的指令集嗎?”在中,我觀察了幾種不同的Linux *設(shè)置使用的指令種類,以及改變運行的處理器類型對每種設(shè)置的影響。作為這個職位的后續(xù),現(xiàn)在我已經(jīng)為Microsof t Windows 10做了同樣的工作。在本文中,我將介紹Windows 10如何在各種處理器之間運行,以及它的行為與Ubuntu * 16相比如何?;氐経buntu查看不同使用場景下的指令使用情況。
實驗裝置
就像之前一樣,我在WindRiver Simics虛擬平臺工具中使用了我們的“通用PC”平臺,并使用了兩種不同的處理器型號來運行它。一個型號是英特爾酷睿i7第1代處理器(代號“Nehalem”),另一個型號是英特爾酷睿i7第6代處理器(代號“Skylake”)。
使用這些不同的模型,我啟動了Windows 10映像(準(zhǔn)確地說是build 1511)。就像之前一樣,我在開機的前60秒就跑完了,最后在一個閑置的桌面上。
下面是啟動幾個Windows 10目標(biāo)從我的筆記本電腦收集統(tǒng)計數(shù)據(jù)的截圖:
在啟動過程中,我使用Simics工具環(huán)境來收集我看到的指令類型的統(tǒng)計數(shù)據(jù)。我計算每個助記符的指令用法,就像上一篇文章一樣。另外,我在下面討論的基礎(chǔ)上,按照其他標(biāo)準(zhǔn)閱讀了指令流。
跨越世代的指示
首先,我檢查了在引導(dǎo)過程中出現(xiàn)的百分之一或更多的動態(tài)指令的所有指令。結(jié)果如下圖所示:
我們在Windows數(shù)據(jù)中看到的與我們在之前的博客文章中看到的Ubuntu 16非常相似。各代處理器之間有一些微小的變化,但是不管處理器是什么,大多數(shù)相同的代碼都可以運行。
對于Ubuntu和Windows等廣泛使用的通用操作系統(tǒng)發(fā)行版來說,這并不意外。在之前的博文中,各代處理器之間最顯著的區(qū)別是Yocto * Linux版本,這是有道理的。
Yocto允許您為自己構(gòu)建一個Linux,當(dāng)涉及到包含使用新指令集的代碼時,它的默認值可以更激進,因為您通常不需要支持廣泛的用戶基礎(chǔ)。對于Ubuntu和Windows 10來說,它們擁有廣泛的用戶基礎(chǔ)和共同的目標(biāo),能夠為大量用戶提供可靠的工作。各代硬件之間的太多差異將使測試和質(zhì)量控制更加困難。不像在自己的Linux上運行時,不要主動為單個系統(tǒng)進行優(yōu)化。
反正我們看使用的指令,最常見的是move、compare、jump和basic算術(shù)。這與我們在Linux上看到的非常相似,但使用的確切指令確實有點不同。
比較Linux
當(dāng)我們在這里更改操作系統(tǒng)時,編譯器用于構(gòu)建代碼更改(從Linux *上的gcc到Windows上的Microsoft *編譯器),以及如何完成函數(shù)調(diào)用和操作系統(tǒng)調(diào)用的約定。所有這些都會影響編譯器中的指令選擇過程,因此工作負載之間使用的實際指令可能會有所不同。事實上,我們甚至可以看到工作負載中使用的一些唯一的指令。在我們當(dāng)前的數(shù)據(jù)集中有一些這樣的例子。
Windows 10從不使用LEAVE或ENTER命令。正如我在之前的博客文章中所討論的,舊的Linux 2.6 Busybox *安裝程序確實使用了LEAVE,但是新的Linux發(fā)行版沒有使用它。由于Windows 10是一個相當(dāng)新的軟件堆棧,它甚至不再使用LEAVE指令。
有一些使用Windows 10的說明,但是沒有Linux的設(shè)置。最重要的一個是來自英特爾SIMD流指令擴展2(SSE2)指令集的MOVNTI指令。占Windows的三分之二以上!另外,除了上面提到的最常見的指令,Windows 10還使用了幾個獨特的沒有任何Linux變種的矢量指令:PADDW、PSRLW、PMOVZXBW、PUNPCKHQDQ、PSUBW和PMADDWD。鑒于矢量指令集的豐富性,這并不奇怪。
Windows(而不是Linux)也使用原8086指令集的CMC(補充進位標(biāo)志)指令。這同樣適用于80386的BSR(位反向掃描)。它們并不常見(測量值低于0.01%),但有趣的是它們從未在Linux引導(dǎo)中使用過。
請注意,這只是關(guān)于操作系統(tǒng)的啟動過程;應(yīng)用程序的情況可能有所不同。其實我在Linux上做了一些其他的實驗,結(jié)果如下。
矢量和SIMD
啟動時,矢量指令不會用得太多。對于Windows來說,v1和v6處理器之間的差異并不是特別大——在Linux上這種差異更加明顯。然而,當(dāng)Windows 10與Ubuntu 16進行比較時,它變得更加有趣:
一般來說,Windows和Ubuntu在啟動時使用矢量指令的比例是一樣的(5%左右)。然而,這些向量指令以不同的方式分布。Windows使用更多的SSE2指令,而Ubuntu使用更多的MMX指令。Windows不會改變各代之間使用的指令,并且在v6處理器上幾乎沒有任何明顯的英特爾高級矢量擴展指令集(AVX)的使用。
還有更多的事情
這種考察指令助記符的方法,其實只是一個簡單的例子,你可以在虛擬平臺中用工具運行的軟件中觀察到。這已經(jīng)相當(dāng)豐富了,但還有更多的觀察和統(tǒng)計。作為Simics的用戶,你可以編程工具來收集你想要的任何東西(只要它是虛擬平臺的一部分)。
例如,以下是Windows 10在v6處理器上啟動時指令大小的分配:
每條執(zhí)行指令的平均大小約為3.73字節(jié)。請注意,這并不表示代碼的大小。這代表了高速緩存系統(tǒng)和處理器解碼器的壓力。英特爾架構(gòu)(IA)是一種經(jīng)典的可變長度指令集。這里可以清楚地看到,指令長度的范圍從1字節(jié)到14字節(jié)。值得注意的是,真正長的指令也非常少見。
分割指令的另一種方法是查看操作數(shù)類型和指令操作碼。這是一個比上面使用的助記法更細粒度的分段。例如,MOV指令的20種最常見的變體如下:
這遠遠不是全部.還有許多其他特定的尋址模式在使用。這是一個典型的長尾分布:到目前為止,絕大多數(shù)的MOV操作是最常見的模式,同時頻繁使用更復(fù)雜的模式也很重要。
注意,我們在這里看到所有大小的移動:僅僅因為這是一個運行在64位處理器上的64位Windows操作系統(tǒng),并不意味著所有的操作實際上都是64位大小的。字節(jié)(8位)、字(16位)和雙字(32位)操作也被使用。32位和64位一樣常見。
在Linux桌面的向量和SIMD
當(dāng)與我的一位同事討論這些測量結(jié)果時,問題出現(xiàn)在一般矢量指令和AVX指令中,以及它們?nèi)绾畏浅R蕾囉谒褂玫墓ぷ髫撦d。操作系統(tǒng)引導(dǎo)不太可能用它來進行多個小密碼和可能的一些高度優(yōu)化的內(nèi)存復(fù)制操作。但是他在交互使用系統(tǒng)時看到了一些其他的行為。所以,我做了另一個實驗。我把Ubuntu的v6處理器放在那里,開機后開始運行一些交互軟件。本質(zhì)上,打開一個終端并啟動一個新的Firefox進程。
從圖中可以看出,AVX命令在桌面活動中被廣泛使用——甚至包括更新的AVX2命令和FMA3命令。向量實際上包含了所有執(zhí)行指令的12%以上,記住這包括了整個機器中的所有指令,而不僅僅是用戶級代碼或圖形子系統(tǒng)中的代碼。
結(jié)論
這是第二篇博客文章,用圖表和數(shù)字詳細說明了在不同處理器類型的許多不同工作負載中執(zhí)行的不同類型的指令。這是一個像我這樣的計算機架構(gòu)呆子的數(shù)據(jù)集。然而,最有趣的是如何收集數(shù)字——使用Simics及其儀器功能。Simics可以模擬幾乎任何系統(tǒng),并允許非侵入式檢查和調(diào)試。收集指令統(tǒng)計數(shù)據(jù),例如,我在這里為處理器設(shè)計師、軟件工程師、研究人員和學(xué)生提供有用的見解。
這里有一個簡單的插件:Simics是免費提供給大學(xué)的。它是用于計算機體系結(jié)構(gòu)、操作系統(tǒng)、網(wǎng)絡(luò)、嵌入式系統(tǒng)、仿真、虛擬平臺和底層編程的多功能工具。
[聲明]本網(wǎng)轉(zhuǎn)載網(wǎng)絡(luò)媒體稿件是為了傳播更多的信息,此類稿件不代表本網(wǎng)觀點,本網(wǎng)不承擔(dān)此類稿件侵權(quán)行為的連帶責(zé)任。故此,如果您發(fā)現(xiàn)本網(wǎng)站的內(nèi)容侵犯了您的版權(quán),請您的相關(guān)內(nèi)容發(fā)至此郵箱【779898168@qq.com】,我們在確認后,會立即刪除,保證您的版權(quán)。
官網(wǎng)優(yōu)化
整站優(yōu)化
渠道代理
400-655-5776