你們好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給你們介紹的是微處理器CPU性能測試基準Dhrystone。算法
在嵌入式系統行業用於評價CPU性能指標的標準主要有三種:Dhrystone、MIPS、CoreMark,其中Dhrystone是一種古老的卻歷時30年而不衰的嵌入式系統處理器測試基準,至今仍爲各大處理器生產廠商所採用。今天痞子衡就和你們詳細聊一聊Dhrystone。函數
在講Dhrystone以前,痞子衡想先給你們簡介一下20世紀70-80年代開始流行的幾個性能測試標準,它們分別是Livermore、Whetstone、Linpack、Dhrystone,這四個性能測試標準也被合稱爲Classic Benchmark。這個網址簡單介紹了四大經典性能測試標準歷史 http://www.roylongbottom.org.uk/classic.htm。oop
細心的朋友應該會注意到Dhrystone與另外一標準Whetsone名字有點相似,其實Dhrystone就是爲了與算法Whetsone區分而設計的。Whetsone於1972年所開發,主要目的是模仿60個1970年後的程序算法。其最有名的版本爲Fortran版,高度反映了60年代數字計算方向。Dhrystone與Whetsone不一樣之處在於其並不包括浮點運算。性能
Dhrystone是由Reinhold P. Weicker在1984年提出來的一個基準測試程序,其主要目的是測試處理器的整數運算和邏輯運算的性能。Dhrystone首先用Ada語言發佈,後來Rick Richardson爲Unix開發了用C語言編寫的Version 1.1,這個版本也成功的推進了Dhrystone的普遍應用。
Dhrystone標準的測試方法很簡單,就是單位時間內跑了多少次Dhrystone程序,其指標單位爲DMIPS/MHz。MIPS是Million Instructions Per Second的縮寫,每秒處理的百萬級的機器語言指令數。DMIPS中的D是Dhrystone的縮寫,它表示了在Dhrystone標準的測試方法下的MIPS。
關於DMIPS有一個不得不注意的點,由於歷史緣由咱們把在VAX-11/780機器上的測試結果1757 Dhrystones/s定義爲1 DMIPS,所以在其餘平臺測試到的每秒Dhrystones數應除以1757,纔是真正的DMIPS數值,故DMIPS其實表示的是一個相對值。測試
Dhrystone程序的最新版本是2.1,其實際上於1988年便已停更。Dhrystone並無官網,因此想下載其源程序可能會有不少來源,有各類語言版本的實現,以及各類平臺下的移植程序。
Roy Longbottom,是一個來自英國政府計算機採購部門Central Computer and Telecommunications Agency (CCTA)的職員,他製做了一個PC性能測試結果網站,蒐集了不少性能測試程序以及結果,其中便有Dhrystone,咱們能夠從他的網站下載Dhrystone源碼(C語言版)。網站
核心程序下載 http://www.roylongbottom.org.uk/classic_benchmarks.tar.gz設計
核心程序包下載後,在\classic_benchmarks\source_code\dhrystone2\下可找到源代碼。詳細文件目錄以下:code
\classic_benchmarks\source_code\dhrystone2 \dhry.h --關於兼容性的原型定義 \dhry_1.c --主程序入口 \dhry_2.c --算法子程序
若是是移植到ARM Cortex-M平臺下裸系統運行,通常只須要簡單修改dhry.h和dhry_1.c文件便可,Dhrystone自己並無太多移植工做,其源碼本是用做在PC上運行的,而在嵌入式系統裏運行僅須要把一些文件I/O的相關代碼刪除便可,此外就是計時函數和打印函數的重實現。htm
Dhrystone源碼幾乎沒有提供配置選項,惟一一個能算得上的配置就是關於REG的宏定義,即你所選用的IDE和嵌入式平臺是否支持regiser關鍵字。blog
讓咱們嘗試分析Dhrystone主函數入口main:
void main (int argc, char *argv[]) { One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; One_Fifty Int_3_Loc; REG char Ch_Index; Enumeration Enum_Loc; Str_30 Str_1_Loc; Str_30 Str_2_Loc; REG int Run_Index; REG int Number_Of_Runs; int endit, count = 10; // ... // 定義和初始化關鍵buffer Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; // ... // 設置循環跑Dhrystone核心算法程序次數 Number_Of_Runs = 5000; do { Number_Of_Runs = Number_Of_Runs * 2; count = count - 1; // 開始循環跑Dhrystone核心算法程序且記錄累計消耗時間 start_time(); for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { Proc_5(); Proc_4(); // ... } end_time(); User_Time = secs; printf ("%12.0f runs %6.2f seconds \n",(double) Number_Of_Runs, User_Time); if (User_Time > 2) { count = 0; } else { if (User_Time < 0.05) { Number_Of_Runs = Number_Of_Runs * 5; } } } while (count >0); // ... // 最終信息的打印 if (User_Time < Too_Small_Time) { printf ("Measured time too small to obtain meaningful results\n"); printf ("Please increase number of runs\n"); printf ("\n"); } else { Microseconds = User_Time * Mic_secs_Per_Second / (double) Number_Of_Runs; Dhrystones_Per_Second = (double) Number_Of_Runs / User_Time; Vax_Mips = Dhrystones_Per_Second / 1757.0; printf ("Microseconds for one run through Dhrystone: "); printf ("%12.2lf \n", Microseconds); printf ("Dhrystones per Second: "); printf ("%10.0lf \n", Dhrystones_Per_Second); printf ("VAX MIPS rating = "); printf ("%12.2lf \n",Vax_Mips); printf ("\n"); } // ... }
當移植好Dhrystone程序後,即可以開始跑起來了,下面是一個主頻100MHz的Pentium處理器跑分結果:
Dhrystone Benchmark Version 2.1 (Language: C) Final values: Int_Glob: O.K. 5 Bool_Glob: O.K. 1 Ch_1_Glob: O.K. A Ch_2_Glob: O.K. B Arr_1_Glob[8]: O.K. 7 Arr_2_Glob8/7: O.K. 1600010 Ptr_Glob-> Ptr_Comp: * 98008 Discr: O.K. 0 Enum_Comp: O.K. 2 Int_Comp: O.K. 17 Str_Comp: O.K. DHRYSTONE PROGRAM, SOME STRING Next_Ptr_Glob-> Ptr_Comp: * 98008 same as above Discr: O.K. 0 Enum_Comp: O.K. 1 Int_Comp: O.K. 18 Str_Comp: O.K. DHRYSTONE PROGRAM, SOME STRING Int_1_Loc: O.K. 5 Int_2_Loc: O.K. 13 Int_3_Loc: O.K. 7 Enum_Loc: O.K. 1 Str_1_Loc: O.K. DHRYSTONE PROGRAM, 1'ST STRING Str_2_Loc: O.K. DHRYSTONE PROGRAM, 2'ND STRING Register option Selected. Microseconds 1 loop: 4.53 Dhrystones / second: 220690 VAX MIPS rating: 125.61
其中最核心的數據即是Dhrystones / second的數值。
Roy Longbottom的網站收集記錄了不少款處理器的Dhrystone跑分結果,可移步他的網站連接查看 http://www.roylongbottom.org.uk/dhrystone%20results.htm#anchorAndroid
至此,微處理器CPU性能測試基準Dhrystone痞子衡便介紹完畢了,掌聲在哪裏~~~