0

目前我正在對兩個32位微控制器進行性能比較。我使用Dhrystone基準測試在兩個微控制器上運行。一個微控制器具有4KB I-cache,而第二個控制器具有8KB I-cache。兩款微控制器都使用相同的工具鏈。儘可能多地在兩個微控制器上保持相同的靜態和運行時間設置。但具有4KB緩存的微控制器比8KB緩存微控制器更快。兩款微控制器都來自同一家廠商,並且基於相同的CPU。32位微控制器上的Drhystone基準測試

任何人都可以提供一些信息,爲什麼具有4KB緩存的微控制器比其他更快?

回答

0

基準測試通常是無用的。 dhrystone是最古老的之一,在管道和編譯器優化過多之前,dhrystone可能已經有了一點價值。我想我大概在15年前就開始使用dhrystone了。

這是微不足道的證明,該代碼

.globl ASMDELAY 
ASMDELAY: 
    sub r0,r0,#1 
    bne ASMDELAY 
    bx lr 

這主要是兩個指令,可廣泛應用於執行時間,如果你瞭解現代處理器的工作變化在同一芯片上。看到這個簡單的技巧是關閉緩存和預取器等,並將此代碼放置在偏移量爲0x0000的地方,用一些值調用它。將其置於0x0004重複,然後在0x0008處重複。繼續這樣做。你可以在減法和分支之間放置一個,兩個等等。嘗試在各種偏移量。

然後,如果您在閃存的處理器外部預取了預取,請打開各個對齊的高速緩存,然後打開和關閉這些對齊。

那麼,改變你的時鐘,尤其是那些你必須根據時鐘速率調整等待狀態的MCU。

在單個MCU上,您將會看到基本上兩條指令在執行時間上差異很大。在某些情況下,讓我們說比其他人長20倍。

現在拿一個小程序或dhrystone程序的一小部分。爲你的單片機編譯,你看到了多少指令?在編譯命令行中對主要優化和其他變體進行較小的修改,代碼更改的次數。如果兩條指令在執行時間內調用20次,可以得到200條指令或2000條指令有多差?它會變得很糟糕。

如果您現在使用的編譯器選項帶有dhrystone程序,請進入引導程序,添加一個nop(導致整個二進制文件在閃存中移動一條指令)再次運行。加兩個,三個,四個。你還沒有比較在一個系統上運行基準測試的不同mcus。

運行有和沒有d緩存,有和沒有i緩存,如果你有每個這些。如果你有一個閃存預取,打開和關閉閃存預取,如果你有一個寫入緩衝,你可以打開和嘗試。仍然保留在相同的編譯器相同的選項相同的單片機。

將dhrystone源代碼中的不同功能,並重新安排在源代碼中。而不是Proc_1,Proc_2,Proc_3使其成爲Proc_1,Proc_3,Proc_2。再次做所有以上。重新安排,重複。

在離開這個MCU之前,您現在應該看到,完全未修改的相同源代碼的執行時間(除了重新安排函數之外)可以並且將具有大不相同的執行時間。

如果您然後開始更改編譯器選項或保持相同的源代碼並更改編譯器,您將看到更多的執行時間差異。

dhrystone基準測試今天或回來的時候怎麼可能每個平臺都有一個結果?簡單的說,這個結果只是一個廣泛的範圍,並不代表該平臺。

因此,如果您嘗試比較兩個不同的硬件平臺,它是來自同一供應商或不同供應商的不同MCU的同一個ARM內核。假設(這不是一個安全的假設),即使假設使用了相同的verilog編譯和合成,它也具有相同的編譯/編譯選項。您可以根據手臂提供的選項進行相同的核心更改。無論如何,在兩個實例或兩個不同的供應商包裝相同的核心,供應商如何是同一個供應商,你會看到變化。然後採取一個完全不同的核心,不管是另一隻手臂還是一個mips等等,如何比較使用這種程序的用戶如何獲得任何價值?這些程序本身在每個平臺上的差異很大?

你不能。你可以做的就是用基準測試來衡量一個事物比另一個更好,一臺計算機比另一臺計算機快,一臺編譯器比另一臺編譯器快。爲了銷售電腦或編譯器。 Sprint的覆蓋率在Verizons的百分之一之內......是否告訴我們有用的東西?不。

如果你想從等式中消除編譯器,並且如果它們真的是相同的「CPU」,來自ARM的源代碼的同一個版本,構建方式相同,那麼它們應該獲取相同的內容,但大小緩存是其中的一部分,所以它可能已經是不同的cpu實現,因爲緩存的寬度或深度會影響事物。在軟件中,它就像需要一個32位的指針而不是一個16位的指針(17位而不是16位,但是你不能在邏輯上有17位)。不管怎麼說,如果你爲一個地址空間編譯一段時間的測試代碼,這個地址空間對於兩個平臺來說都是相同的,那麼你可以根據需要使用相同的二進制代碼,注意C庫調用strcpy,等等也必須在平臺之間相同的空間相同,以消除編譯器和對齊從而搞砸你。這可能會或可能不會使賽場水平。

如果你想相信這些是相同的cpu,那麼關掉這些緩存,通過這樣做來消除編譯器的變化。看看他們是否執行相同的。將程序複製到內存並運行內存,消除閃存問題。我假設你有他們兩個同樣的閃存相同的等待狀態?

如果他們是相同的CPU和芯片供應商已與這兩個芯片使內存系統採取相同數量的時鐘說ram訪問,這是真的一樣的cpu,你應該能夠得到相同的通過消除優化(緩存,閃存預取,對齊)。

你可能看到的是某種形式的代碼與編譯器與緩存行之間的代碼在內存中的對齊方式,或者它可能簡單得多,它可能只是緩存中的差異,命中和未命中工作和4KB比這個特定程序的8KB更幸運,以某種方式編譯,以特定方式在內存中對齊等。

通過上面簡單的兩條指令循環,很容易看出一些原因在同一個系統上,性能會有所不同,如果你的現代cpu一次獲取8條指令,並且你的循環太靠近該提取的尾端,那麼預取可能會認爲它需要獲取另外8個超出那些時鐘週期的成本。當然,當你準確地跨越兩條「獲取線」時,我將這兩條指令稱爲它們,即使使用緩存,每循環也要花費更多的週期。當這兩條指令接近高速緩存行時(因爲您改變每次測試的對齊方式)時會發生同樣的問題,最終需要兩次高速緩存行讀取而不是一次讀取這兩條指令。至少第一次通過那裏是額外的緩存行讀取。第一次使用的額外時鐘是您可以使用像這樣的簡單基準測量時看到的東西,同時玩對齊。

Michael Abrash,禪宗的彙編語言。有一個epub/etc你可以從本書的github中構建。當這本書出來時,8088已經過時了,如果你看到8088的東西,那麼你完全忽略了這一點。它適用於當今最先進的處理器,如何查看問題,如何測試,如何計時以及如何解釋結果。到目前爲止我所提到的所有東西,以及我所知道的所有我沒有提到過的東西,都來自書中的知識,儘管我已經這麼做了幾十年。

所以再次如果你已經真正消除了編譯器,對齊,CPU,與該CPU相關聯的內存系統等,並且它只有緩存的大小不同。然後,它可能與高速緩存行如何根據代碼與兩個高速緩存的高速緩存行對齊來獲取命中和未命中有關。一個是擊中更多,缺少和/或更好地驅逐這個特定的二進制文件。您可以嘗試重新安排函數,添加nops,或者如果不能獲得引導程序,則在二進制文件的較低地址處添加整個函數或更多代碼(另一個printf等),導致鏈接器將測試中的代碼滑動到不同的地址改變了程序如何與高速緩存行對齊。由於被測代碼中的函數非常大(需要執行幾條指令),您必須開始修改程序,以便相對於緩存行獲得更精細的二進制調整。

如果您調整對齊方式,或者根據重新排列的函數重新排列二進制文件,那麼您絕對應該在兩個平臺上看到執行時間差異。

底線基準不真的告訴你很多,結果有更多的消極臭味,而不是積極的喜悅。如果沒有重新編寫特定的基準測試或應用程序,只需在一個平臺(即一切都相同,但高速緩存的大小或兩個完全不同的體系結構)上做得更好,即使您嘗試通過對齊來改變結果,開啓關閉預取,寫入緩衝,分支預測等。拉出所有可能出現的技巧可能會有所不同,從x到y另一個從n到m,也許在範圍中有一些重疊。對於這兩種平臺,除了緩存大小外,我希望能找到一種組合,其中A有時比B快,至少有一種組合的情況B比A快,同時打開和關閉相同的功能在那個比較。如果/當您切換到某個其他應用程序/基準測試時,這一切都會重新開始,沒有理由假定dhrystone結果可以預測任何其他待測代碼。唯一重要的程序,尤其是MCU是最終構建的應用程序。只需記住更改一行代碼,或者甚至在引導程序中添加單個nop可以在性能方面產生顯着的結果,有時幾個TIMES從單個nop慢或更快。