記錄一下實(shí)驗(yàn)過程,方便后續(xù)回顧
一、Dhrystone簡介
Dhrystone是測量處理器運(yùn)算能力的最常見基準(zhǔn)程序之一,常用于處理器的整型運(yùn)算性能的測量。程序是用C語言編寫的,因此C編譯器的編譯效率對測試結(jié)果也有很大影響。
但其也有許多不足,Dhrystone不僅不適合于作為嵌入式系統(tǒng)的測試向量,甚至在其大多數(shù)場合下都不適合進(jìn)行應(yīng)用。Dhrystone還有許多漏洞,例如:易被非法利用、人為痕跡明顯、代碼長度太短、缺乏驗(yàn)證及標(biāo)準(zhǔn)的運(yùn)行規(guī)則等。該程序是用C編寫的,容易受到編譯器影響,不同優(yōu)化選項(xiàng)下,測試的性能并不一致。代碼量小,在現(xiàn)代CPU中,它能夠被放進(jìn)指令緩存中,所以它并不能嚴(yán)格的測量取指性能。
Dhrystone標(biāo)準(zhǔn)的測試方法很簡單,就是單位時(shí)間內(nèi)跑了多少次Dhrystone程序,其指標(biāo)單位為DMIPS/MHz。MIPS是Million Instructions Per Second的縮寫,每秒處理的百萬級的機(jī)器語言指令數(shù)。DMIPS中的D是Dhrystone的縮寫,它表示了在Dhrystone標(biāo)準(zhǔn)的測試方法下的MIPS。
關(guān)于DMIPS有一個(gè)不得不注意的點(diǎn),因?yàn)闅v史原因我們把在VAX-11/780機(jī)器上的測試結(jié)果1757 Dhrystones/s定義為1 DMIPS,因此在其他平臺測試到的每秒Dhrystones數(shù)應(yīng)除以1757,才是真正的DMIPS數(shù)值,故DMIPS其實(shí)表示的是一個(gè)相對值。
二、源碼
可以直接移植官方版本的,但是如果移植官方的會有比較多的錯(cuò)誤。
比如:
- 常見C庫函數(shù)的重定義(malloc等)
- 沒有包含使用到的C庫的頭文件
- 一些系統(tǒng)定義的變量,如系統(tǒng)中斷HZ變量沒有包含
- 函數(shù)沒有聲明等
網(wǎng)上有多個(gè)版本的,這里使用的是包含dry.h、dry1.c和dry2.c的源碼。并且該版本修復(fù)了一些已知的錯(cuò)誤。基于dhrystone2.2版本。
https://github.com/iwannatto/dhrystone
三、編譯
1.修改Makefile文件
需要做的就是簡單修改Makefile文件即可編譯代碼:設(shè)置交叉工具鏈、把一些沒有要的代碼注釋掉,下面是我簡單修改后的Makefile文件。
注意:CTOOL:=arm-linux-gnueabi- 和 CCL:=/usr 要修改為自己的安裝路徑
安裝32位gcc編譯器 sudo apt-get install gcc-arm-linux-gnueabi
.PHONY: run clean
# Set compilation tool chain
CTOOL:=arm-linux-gnueabi-
CCL:=/usr
CC:=${CCL}/bin/${CTOOL}gcc
CFLAGS=-O3
run: dry2 dry2nr dry2o
# ./dry2 ${1-50000} 2>/dev/null
# ./dry2nr ${1-50000} 2>/dev/null
# ./dry2o ${1-50000} 2>/dev/null
dry2: dry.h dry1.c dry2.c
${CC} -c ${CFLAGS} dry1.c -o dry1.o -static
${CC} ${CFLAGS} dry2.c dry1.o ${LFLAGS} -o dry2 -static
dry2nr: dry.h dry1.c dry2.c
${CC} -c -DREG ${CFLAGS} dry1.c -o dry1.o -static
${CC} -DREG ${CFLAGS} dry2.c dry1.o ${LFLAGS} -o dry2nr -static
dry2o: dry.h dry1.c dry2.c
${CC} -c -O ${CFLAGS} dry1.c -o dry1.o -static
${CC} -O ${CFLAGS} dry2.c dry1.o ${LFLAGS} -o dry2o -static
clean:
rm -f dry1.o dry2 dry2nr dry2o
使用make
進(jìn)行編譯,多線程make -j8
,這里可以根據(jù)電腦實(shí)際配置修改,不加-j
也很快。
ps:其他編譯方式
cc編譯
cc -c dry.c -o dry1.o
cc -DPASS2 dry.c dry1.o -o dry2
gcc編譯
gcc -c dry.c -o dry1.o
gcc -DPASS2 dry.c dry1.o -o dry2
sudo apt-get install gcc-arm-linux-gnueabi
sudo apt-get install gcc-aarch64-linux-gnu
arm32位編譯(使用32位編譯)
arm-linux-gnueabi-gcc -c dry.c -o dry1.o
arm-linux-gnueabi-gcc -DPASS2 dry.c dry1.o -o dry2 -static
arm64位編譯
aarch64-linux-gnu-gcc -c dry.c -o dry1.o
aarch64-linux-gnu-gcc -DPASS2 dry.c dry1.o -o dry2 -static
通過上一步編譯得到三個(gè)可執(zhí)行文件,分別是dry2、dry2nr、dry2o
這三個(gè)文件的區(qū)別就是編譯的時(shí)候使用了不同的參數(shù)。
dry2:普通的編譯
dry2nr:編譯加了-DREG
dry2o:編譯添加了-O,優(yōu)化了代碼
四、運(yùn)行
要運(yùn)行在手機(jī)上,需要通過adb將編譯得到的可執(zhí)行程序push到手機(jī)上。然后給其增加權(quán)限。
我這里把一整個(gè)文件夾都傳過來了。
adb push D:\xxx\Dry /data/local/tmp
chmod 777 dry2 dry2nr dry2o
通過adb shell進(jìn)入文件系統(tǒng),找到可執(zhí)行程序,直接運(yùn)行即可。文章來源:http://www.zghlxwxcb.cn/news/detail-527897.html
flame:/data/local/tmp/Dry # ./dry2o
Dhrystone Benchmark, Version C, Version 2.2
Program compiled without 'register' attribute
Using times(), HZ=100
Trying 50000 runs through Dhrystone:
Measured time too small to obtain meaningful results
Trying 500000 runs through Dhrystone:
Measured time too small to obtain meaningful results
Trying 5000000 runs through Dhrystone:
Measured time too small to obtain meaningful results
Trying 50000000 runs through Dhrystone:
Final values of the variables used in the benchmark:
Int_Glob: 5
should be: 5
Bool_Glob: 1
should be: 1
Ch_1_Glob: A
should be: A
Ch_2_Glob: B
should be: B
Arr_1_Glob[8]: 7
should be: 7
Arr_2_Glob[8][7]: 50000010
should be: Number_Of_Runs + 10
Ptr_Glob->
Ptr_Comp: 0x83e360
should be: (implementation-dependent)
Discr: 0
should be: 0
Enum_Comp: 2
should be: 2
Int_Comp: 17
should be: 17
Str_Comp: DHRYSTONE PROGRAM, SOME STRING
should be: DHRYSTONE PROGRAM, SOME STRING
Next_Ptr_Glob->
Ptr_Comp: 0x83e360
should be: (implementation-dependent), same as above
Discr: 0
should be: 0
Enum_Comp: 1
should be: 1
Int_Comp: 18
should be: 18
Str_Comp: DHRYSTONE PROGRAM, SOME STRING
should be: DHRYSTONE PROGRAM, SOME STRING
Int_1_Loc: 5
should be: 5
Int_2_Loc: 13
should be: 13
Int_3_Loc: 7
should be: 7
Enum_Loc: 1
should be: 1
Str_1_Loc: DHRYSTONE PROGRAM, 1'ST STRING
should be: DHRYSTONE PROGRAM, 1'ST STRING
Str_2_Loc: DHRYSTONE PROGRAM, 2'ND STRING
should be: DHRYSTONE PROGRAM, 2'ND STRING
Microseconds for one run through Dhrystone: 0.0
Dhrystones per Second: 24271844
最后的得分就是:24271844/1757/xxMHz文章來源地址http://www.zghlxwxcb.cn/news/detail-527897.html
到了這里,關(guān)于Dhrystone基準(zhǔn)測試程序在Google Pixel4上運(yùn)行跑分教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!