Dhrystone基准测试程序在Google Pixel4移动终端手机上运行教程 | 嵌入式设备Benchmark

记录一下实验过程,方便后续回顾

一、Dhrystone简介

Dhrystone是测量处理器运算能力的最常见基准程序之一,常用于处理器的整型运算性能的测量。程序是用C语言编写的,因此C编译器的编译效率对测试结果也有很大影响。

但其也有许多不足,Dhrystone不仅不适合于作为嵌入式系统的测试向量,甚至在其大多数场合下都不适合进行应用。Dhrystone还有许多漏洞,例如:易被非法利用、人为痕迹明显、代码长度太短、缺乏验证及标准的运行规则等。该程序是用C编写的,容易受到编译器影响,不同优化选项下,测试的性能并不一致。代码量小,在现代CPU中,它能够被放进指令缓存中,所以它并不能严格的测量取指性能。

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其实表示的是一个相对值。

二、源码

可以直接移植官方版本的,但是如果移植官方的会有比较多的错误。
比如:

  • 常见C库函数的重定义(malloc等)
  • 没有包含使用到的C库的头文件
  • 一些系统定义的变量,如系统中断HZ变量没有包含
  • 函数没有声明等

网上有多个版本的,这里使用的是包含dry.h、dry1.c和dry2.c的源码。并且该版本修复了一些已知的错误。基于dhrystone2.2版本
https://github.com/iwannatto/dhrystone

三、编译

1.修改Makefile文件

需要做的就是简单修改Makefile文件即可编译代码:设置交叉工具链、把一些没有要的代码注释掉,下面是我简单修改后的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进行编译,多线程make -j8,这里可以根据电脑实际配置修改,不加-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

通过上一步编译得到三个可执行文件,分别是dry2、dry2nr、dry2o

这三个文件的区别就是编译的时候使用了不同的参数。

在这里插入图片描述
dry2:普通的编译
dry2nr:编译加了-DREG
dry2o:编译添加了-O,优化了代码

四、运行

要运行在手机上,需要通过adb将编译得到的可执行程序push到手机上。然后给其增加权限。
我这里把一整个文件夹都传过来了。

adb push D:\xxx\Dry /data/local/tmp
chmod 777 dry2 dry2nr dry2o

通过adb shell进入文件系统,找到可执行程序,直接运行即可。

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CCS是Code Composer Studio的缩写,是德州仪器(Texas Instruments)开发的一款集成开发环境(IDE)。 Dhrystone是一个基准测试程序,用于测量计算机系统的性能。在CCS中,可以通过以下步骤找到Dhrystone例程: 1. 打开CCS,在"Project Explorer"视图中右键单击"New",选择"CCS Project"。 2. 在"Project Type"对话框中,选择"Empty Project",并为项目命名。 3. 在"New Project"对话框中,选择"TI ARM Compiler"作为编译器,选择目标设备和连接器脚本。 4. 选择"Finish"创建项目。 5. 在"Project Explorer"视图中右键单击项目名称,选择"New",然后选择"C File"。 6. 输入文件名并选择"Finish"。 7. 将下面的Dhrystone代码复制到新的C文件中: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define LOOPS 1000 static int dhrystone(int loops); int main(void) { clock_t start, end; double cpu_time_used; start = clock(); dhrystone(LOOPS); end = clock(); cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("Dhrystone benchmark results:\n"); printf("Loops: %d\n", LOOPS); printf("Time: %f seconds\n", cpu_time_used); return 0; } static int dhrystone(int loops) { int i; int dhrystones_per_second; unsigned long delta; unsigned long count; unsigned long nsec_per_clock; unsigned long nsec_per_dhry; struct timeval start_timeval, end_timeval; count = 0; gettimeofday(&start_timeval, NULL); do { i = 100; do { i--; dhrystones_per_second = i; } while (i != 0); count++; gettimeofday(&end_timeval, NULL); } while ((end_timeval.tv_sec - start_timeval.tv_sec) < 1); delta = (end_timeval.tv_sec - start_timeval.tv_sec) * 1000000 + (end_timeval.tv_usec - start_timeval.tv_usec); nsec_per_clock = delta * 1000 / (count * 1000000); nsec_per_dhry = nsec_per_clock / dhrystones_per_second; return nsec_per_dhry; } ``` 8. 保存文件并编译项目。 9. 在CCS中运行程序,可以在控制台窗口中看到Dhrystone基准测试的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿知

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值