Lichee_RV学习系列---移植dhrystone

article/2025/9/21 23:38:52

Lichee_RV学习系列文章目录

Lichee_RV学习系列—认识Lichee_RV、环境搭建和编译第一个程序


文章目录

  • Lichee_RV学习系列文章目录
  • 一、dhrystone简介
  • 二、dhrystone源码下载
  • 三、dhrystone移植
    • 1、移植官方源码
    • 2、移植GitHub开源代码
      • a:修改Makefile文件
      • b:编译
    • 3、执行dhrstone代码
  • 总结


一、dhrystone简介

dhrystone是测试CPU运算能力的一个用C编写的程序,检验CPU效率的计量单位是每秒计算多少次Dhrystone。

缺陷:

  • 该程序是用C编写的,容易受到编译器影响,不同优化选项下,测试的性能并不一致。
  • 代码量小,在现代CPU中,它能够被放进指令缓存中,所以它并不能严格的测量取指性能。

参考链接1
百度百科参考链接

二、dhrystone源码下载

dhrystone核心的文件就三个:dhry_1.c、dhry_2.c、dhry.h,只要把这三个文件修改一下就可以了

官方dhrystone 2.1源码
Github:iwannatto,开源的代码
之前写K210的文章有介绍一个Github加速器(往下拉就能找到了),访问不了github可以看看这个文章

三、dhrystone移植

1、移植官方源码

移植可以直接移植官方的,但是如果移植官方的会有比较多的错误。
我移植过程出现的错误就有,一个个修改起来比较麻烦:

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

这个是我编译官方文件出现的问题:

dhry_1.c: In function 'main':
dhry_1.c:150:5: warning: implicit declaration of function 'Proc_5' [-Wimplicit-function-declaration]Proc_5();^~~~~~
dhry_1.c:151:5: warning: implicit declaration of function 'Proc_4' [-Wimplicit-function-declaration]Proc_4();^~~~~~
dhry_1.c:157:19: warning: implicit declaration of function 'Func_2'; did you mean 'Func_1'? [-Wimplicit-function-declaration]Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc);^~~~~~Func_1
dhry_1.c:163:7: warning: implicit declaration of function 'Proc_7' [-Wimplicit-function-declaration]Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc);^~~~~~
dhry_1.c:168:5: warning: implicit declaration of function 'Proc_8' [-Wimplicit-function-declaration]Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc);^~~~~~
dhry_1.c:170:5: warning: implicit declaration of function 'Proc_1'; did you mean 'Func_1'? [-Wimplicit-function-declaration]Proc_1 (Ptr_Glob);^~~~~~Func_1
dhry_1.c:177:9: warning: implicit declaration of function 'Proc_6' [-Wimplicit-function-declaration]Proc_6 (Ident_1, &Enum_Loc);^~~~~~
dhry_1.c:188:5: warning: implicit declaration of function 'Proc_2' [-Wimplicit-function-declaration]Proc_2 (&Int_1_Loc);^~~~~~
dhry_1.c:225:40: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]printf ("  Ptr_Comp:          %d\n", (int) Ptr_Glob->Ptr_Comp);^
dhry_1.c:236:40: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]printf ("  Ptr_Comp:          %d\n", (int) Next_Ptr_Glob->Ptr_Comp);^
dhry_1.c:50:27: error: 'HZ' undeclared (first use in this function)
#define Too_Small_Time (2*HZ)^~
dhry_1.c:263:19: note: in expansion of macro 'Too_Small_Time'if (User_Time < Too_Small_Time)^~~~~~~~~~~~~~
dhry_1.c:50:27: note: each undeclared identifier is reported only once for each function it appears in
#define Too_Small_Time (2*HZ)^~
dhry_1.c:263:19: note: in expansion of macro 'Too_Small_Time'if (User_Time < Too_Small_Time)^~~~~~~~~~~~~~
dhry_1.c: At top level:
dhry_1.c:291:1: warning: return type defaults to 'int' [-Wimplicit-int]
Proc_1 (Ptr_Val_Par)
^~~~~~
dhry_1.c: In function 'Proc_1':
dhry_1.c:307:3: warning: implicit declaration of function 'Proc_3'; did you mean 'Proc_1'? [-Wimplicit-function-declaration]Proc_3 (&Next_Record->Ptr_Comp);^~~~~~Proc_1
dhry_1.c: At top level:
dhry_1.c:325:1: warning: return type defaults to 'int' [-Wimplicit-int]
Proc_2 (Int_Par_Ref)
^~~~~~
dhry_1.c:348:1: warning: return type defaults to 'int' [-Wimplicit-int]
Proc_3 (Ptr_Ref_Par)
^~~~~~
dhry_1.c:363:1: warning: return type defaults to 'int' [-Wimplicit-int]
Proc_4 () /* without parameters */
^~~~~~
dhry_1.c:375:1: warning: return type defaults to 'int' [-Wimplicit-int]
Proc_5 () /* without parameters */
^~~~~~
make: *** [dhry_1.o] Error 1

2、移植GitHub开源代码

我找到github开源的代码,简单修改Makefile文件就能跑的GitHub开源代码,作者是基于dhrystone2.2版本的。

由于iwannatto,它已经把一些警告,他如我上面说到的这些警告和错误已经解决掉了。添加了Linux相关的头文件,比如#include <sys/param.h>、#include <sys/times.h>、#include <string.h>(这些在dry.h头文件都有定义)、正确的声明了Proc_1、Proc_2等函数。

a:修改Makefile文件

需要做的就是简单修改Makefile文件即可编译代码:设置交叉工具链、把一些没有要的代码注释掉,下面是我简单修改后的Makefile文件。

.PHONY: run clean
# Set compilation tool chain
CTOOL:=riscv64-unknown-linux-gnu-
CCL:=/home/allwinner/workspace/tina-D1-H/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702
CC:=${CCL}/bin/${CTOOL}gcc
CFLAGS=-O3run: dry2 dry2nr dry2o
#	./dry2 ${1-50000} 2>/dev/null
#	./dry2nr ${1-50000} 2>/dev/null
#	./dry2o ${1-50000} 2>/dev/nulldry2: dry.h dry1.c dry2.c${CC} -c ${CFLAGS} dry1.c -o dry1.o${CC} ${CFLAGS} dry2.c dry1.o ${LFLAGS} -o dry2 dry2nr: dry.h dry1.c dry2.c${CC} -c -DREG ${CFLAGS} dry1.c -o dry1.o${CC} -DREG ${CFLAGS} dry2.c dry1.o ${LFLAGS} -o dry2nrdry2o: dry.h dry1.c dry2.c${CC} -c -O ${CFLAGS} dry1.c -o dry1.o${CC} -O ${CFLAGS} dry2.c dry1.o ${LFLAGS} -o dry2oclean:rm -f dry1.o dry2 dry2nr dry2o

b:编译

编译文件会有三个可执行文件,分别是dry2、dry2nr、dry2o
在这里插入图片描述

这三个文件的区别就是编译的时候使用了不同的参数。
dry2:普通的编译
dry2nr:编译加了-DREG
dry2o:编译添加了-O,优化了代码

3、执行dhrstone代码

执行先需要先将整个目录放到开发板,直接使用adb push windows目录 Linux目录,将文件送到开发板(ADB使用可以看我这个系列的第一篇文章)
在这里插入图片描述
修改文件权限:chmod 777 dry2 dry2nr dry2o

下面是我执行dry2o后的结果:在我这块Lichee Rv Docx CPU运行的效率为:每秒运行Dhrystones的次数为:3003003

root@MaixLinux:/mnt/dhrystone# ./dry2oDhrystone Benchmark, Version C, Version 2.2
Program compiled without 'register' attribute
Using times(), HZ=100Trying 50000 runs through Dhrystone:
Measured time too small to obtain meaningful resultsTrying 500000 runs through Dhrystone:
Measured time too small to obtain meaningful resultsTrying 5000000 runs through Dhrystone:
Measured time too small to obtain meaningful resultsTrying 50000000 runs through Dhrystone:
Final values of the variables used in the benchmark:Int_Glob:            5should be:   5
Bool_Glob:           1should be:   1
Ch_1_Glob:           Ashould be:   A
Ch_2_Glob:           Bshould be:   B
Arr_1_Glob[8]:       0should be:   7
Arr_2_Glob[8][7]:    50000010should be:   Number_Of_Runs + 10
Ptr_Glob->Ptr_Comp:          0x6417260should be:   (implementation-dependent)Discr:             0should be:   0Enum_Comp:         2should be:   2Int_Comp:          17should be:   17Str_Comp:          DHRYSTONE PROGRAM, SOME STRINGshould be:   DHRYSTONE PROGRAM, SOME STRING
Next_Ptr_Glob->Ptr_Comp:          0x6417260should be:   (implementation-dependent), same as aboveDiscr:             0should be:   0Enum_Comp:         1should be:   1Int_Comp:          18should be:   18Str_Comp:          DHRYSTONE PROGRAM, SOME STRINGshould be:   DHRYSTONE PROGRAM, SOME STRING
Int_1_Loc:           5should be:   5
Int_2_Loc:           13should be:   13
Int_3_Loc:           7should be:   7
Enum_Loc:            1should be:   1
Str_1_Loc:           DHRYSTONE PROGRAM, 1'ST STRINGshould be:   DHRYSTONE PROGRAM, 1'ST STRING
Str_2_Loc:           DHRYSTONE PROGRAM, 2'ND STRINGshould be:   DHRYSTONE PROGRAM, 2'ND STRINGMicroseconds for one run through Dhrystone:        0.3
Dhrystones per Second:                         3003003

这是我运行dry2执行文件的结果:
每秒运行Dhrystones的次数为:1126126

root@MaixLinux:/mnt/dhrystone# ./dry2Dhrystone Benchmark, Version C, Version 2.2
Program compiled without 'register' attribute
Using times(), HZ=100Trying 50000 runs through Dhrystone:
Measured time too small to obtain meaningful resultsTrying 500000 runs through Dhrystone:
Measured time too small to obtain meaningful resultsTrying 5000000 runs through Dhrystone:
Final values of the variables used in the benchmark:Int_Glob:            5should be:   5
Bool_Glob:           1should be:   1
Ch_1_Glob:           Ashould be:   A
Ch_2_Glob:           Bshould be:   B
Arr_1_Glob[8]:       7should be:   7
Arr_2_Glob[8][7]:    5000010should be:   Number_Of_Runs + 10
Ptr_Glob->Ptr_Comp:          0x2db27260should be:   (implementation-dependent)Discr:             0should be:   0Enum_Comp:         2should be:   2Int_Comp:          17should be:   17Str_Comp:          DHRYSTONE PROGRAM, SOME STRINGshould be:   DHRYSTONE PROGRAM, SOME STRING
Next_Ptr_Glob->Ptr_Comp:          0x2db27260should be:   (implementation-dependent), same as aboveDiscr:             0should be:   0Enum_Comp:         1should be:   1Int_Comp:          18should be:   18Str_Comp:          DHRYSTONE PROGRAM, SOME STRINGshould be:   DHRYSTONE PROGRAM, SOME STRING
Int_1_Loc:           5should be:   5
Int_2_Loc:           13should be:   13
Int_3_Loc:           7should be:   7
Enum_Loc:            1should be:   1
Str_1_Loc:           DHRYSTONE PROGRAM, 1'ST STRINGshould be:   DHRYSTONE PROGRAM, 1'ST STRING
Str_2_Loc:           DHRYSTONE PROGRAM, 2'ND STRINGshould be:   DHRYSTONE PROGRAM, 2'ND STRINGMicroseconds for one run through Dhrystone:        0.9
Dhrystones per Second:                         1126126

总结

dhrystone运行的结果我觉得不是特别有参考价值,不太优化结果下,运行的结果都不一样。而且数据相差挺大的,每秒运行Dhrystones次数差不多三倍。所以dhrystone得到的运行的结果看看得了,感觉并不是特别能反映CPU的运行效率。


http://chatgpt.dhexx.cn/article/UOfQ8CEm.shtml

相关文章

痞子衡嵌入式:微处理器CPU性能测试基准(Dhrystone)

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是微处理器CPU性能测试基准Dhrystone。 在嵌入式系统行业用于评价CPU性能指标的标准主要有三种:Dhrystone、MIPS、CoreMark,其中Dhrystone是一种古老的却历时30年而不衰的嵌入式系统处理器测试基准,至今仍为…

浅谈HashMap 的底层原理

本文整理自漫画&#xff1a;什么是HashMap? -小灰的文章 。已获得作者授权。 HashMap 是一个用于存储Key-Value 键值对的集合&#xff0c;每一个键值对也叫做Entry。这些个Entry 分散存储在一个数组当中&#xff0c;这个数组就是HashMap 的主干。 HashMap 数组每一个元素的初…

HashMap底层原理与面试题

文章目录 1 类图2 属性2.1 常见属性介绍2.2 底层数据结构2.3 重要常量2.4 链表和树的问题1 为什么不直接采用红黑树&#xff1f;2 为什么采用红黑树&#xff0c;而不是AVL平衡树&#xff1f; 3 构造器3.1 常用构造器 4 put方法4.1 put操作的整体思路4.2 树操作&#xff08;略&a…

HashMap底层原理全解析

作为面试中的高频题目&#xff0c;我相信每一个java程序员都有必要搞懂HashMap的底层原理和实现细节&#xff0c;废话不多说直接开撸。 首先简单说一下HashMap的实现原理&#xff1a; 首先有一个Node<k,v>类型的数组&#xff0c;当添加一个键值对(key-value)时&#xf…

HashMap 底层原理///HashMap详解

HashMap超详细探讨 总述从集合出发探讨HashMapCollection接口继承树Map接口继承树 从Map接口来&#xff0c;一步一步深入其中Map接口概述Map接口&#xff1a;常用方法Map接口 Map实现类之一&#xff1a;HashMapHashMap的存储结构HashMap源码中的重要常量JDK 1.8之前JDK 1.8总结…

HashMap底层原理(图文并茂,简单易懂)

大家先看下这张图片&#xff1a; 1、HashMap是基于哈希表实现的&#xff0c;而哈希表的底层是数组加上链表的形式。 2、数组内存连续查询效率高&#xff0c;链表内存分散增删改效率高&#xff0c;哈希表采用此种存储数据的形式极大的提高操作数据的效率。 3、哈希表的默认长…

HashMap底层数据结构

HashMap集合&#xff1a; 底层是哈希表/散列表的数据结构 HashMap集合&#xff1a;1、HashMap集合底层是哈希表/散列表的数据结构。2、哈希表是一个怎样的数据结构呢&#xff1f;哈希表是一个数组和单向链表的结合体。数组&#xff1a;在查询方面效率很高&#xff0c;随机增删方…

HashMap底层数据结构(数组+链表+红黑树)

回顾一下HashMap的底层数据结构 HashMap底层实现JDK<1.7数组链表&#xff0c;JDK>1.8数组链表红黑树&#xff1b;HashMap这一个类型底层涉及到3中数据类型&#xff0c;数组、链表、红黑树&#xff0c;其中查询速度最快的是数组&#xff0c;时间复杂度是O(1),链表数据量少…

Java HashMap底层实现

HashMap 是 Java 使用频率最高的用于映射&#xff08;键值对&#xff09;处理的数据类型。JDK1.8 对 HashMap 底层的实现进行了优化&#xff0c;例如引入红黑树的数据结构和扩容的优化等。在JDK1.8以前HashMap是由数组链表的数据结构组成的。 Java为数据结构中的映射定义了一个…

java----hashmap底层原理

概述 在Java集合中&#xff0c;Map是一种特殊的集合&#xff0c;原因在于这种集合容器并不是保存单个元素&#xff0c;而是保存一个一个的Key-Vaue键值对.HashMap是基于哈希表的Map接口的实现,在项目开发中使用广泛,下面就对HashMap的源码进行解析. Hashmap的特点 1.HashMap…

HashMap底层数据结构详解

一、HashMap底层数据结构 JDK1.7及之前&#xff1a;数组链表JDK1.8&#xff1a;数组链表红黑树 关于HashMap基本的大家都知道&#xff0c;但是为什么数组的长度必须是2的指数次幂&#xff0c;为什么HashMap的加载因子要设置为0.75&#xff0c;为什么链表长度大于等于8时转成了…

复习一波HashMap底层实现原理解析

HashMap是JAVA中最常见的集合类框架&#xff0c;也是java语言中非常典型的数据结构&#xff0c;同时也是我们需要掌握的数据结构&#xff0c;更重要的也是面试题必问之一。 我们常见的有集合数据有三种结构&#xff1a;1、数组结构 2、链表结构 3、哈希表结构 下面我们来看看各…

HashMap的底层实现

1. HashMap概述&#xff1a; HashMap是基于哈希表的Map接口的非同步实现&#xff08;Hashtable跟HashMap很像&#xff0c;唯一的区别是Hashtalbe中的方法是线程安全的&#xff0c;也就是同步的&#xff09;。此实现提供所有可选的映射操作&#xff0c;并允许使用null值和null键…

HashMap底层特性全解析

文章目录 一、前言二、HashMap2.1 HashMap数据结构2.2 HashMap线程不安全2.3 哈希冲突 三、JDK1.7中HashMap的实现3.1 基本元素Entry3.2 插入逻辑3.2.1 插入逻辑3.2.2 新建节点添加到链表 3.3 数组扩容逻辑3.4 null处理3.5 辨析扩容、树化和哈希冲突 四、JDK1.8中HashMap的实现…

HashMap底层

1、HashMap底层数据结构 JDK1.7的底层是 数组链表&#xff1b; JDK1.8之后 数组 链表 红黑树&#xff1b; 数组特点&#xff1a;具有随机访问的特点&#xff0c;能达到O(1)的时间复杂度&#xff0c;数组查询快&#xff0c;增删比较麻烦&#xff1b; 链表特点&#xff1a;…

HashMap底层实现和原理(源码解析)

Note&#xff1a;文章的内容基于JDK1.7进行分析&#xff0c;1.8做的改动文章末尾进行讲解。 大家可以看一下:https://www.imooc.com/article/267756 一、先来熟悉一下我们常用的HashMap 1、概述 HashMap基于Map接口实现&#xff0c;元素以键值对的方式存储&#xff0c;并且…

HashMap 底层原理

前言 HashMap 源码和底层原理在现在面试中是必问的。因此&#xff0c;我们非常有必要搞清楚它的底层实现和思想&#xff0c;才能在面试中对答如流&#xff0c;跟面试官大战三百回合。文章较长&#xff0c;介绍了很多原理性的问题&#xff0c;希望对你有所帮助~ 正文 **说明&a…

HashMap底层原理剖析(面试收藏!!!)

HashMap HashMap底层原理剖析(超详细&#xff01;&#xff01;&#xff01;)一、散列表结构二、什么是哈希&#xff1f;三、HashMap原理讲解3.1继承体系图3.2Node数据结构分析3.3底层存储结构3.4put数据原理分析3.5什么是哈希碰撞&#xff1f;3.6JDK8为什么引入红黑树&#xff…

HashMap底层原理

文章目录 1.HashMap的概念2.底层数据结构2.JDK1.8之前存在的问题&#xff1f;3.问题&#xff1a;加载因子为什么默认值为0.75f &#xff1f;4.问题&#xff1a;如果得到key的hash值&#xff08;哈希码&#xff09;5.问题&#xff1a;如何得到插入元素在数组中的下标6.问题&…

HashMap 的底层结构和原理

1. 讲讲 HashMap 的底层结构和原理 HashMap 就是以 Key-Value 的方式进行数据存储的一种数据结构嘛&#xff0c;在我们平常开发中非常常用&#xff0c;它在 JDK 1.7 和 JDK 1.8 中底层数据结构是有些不一样的。总体来说&#xff0c;JDK 1.7 中 HashMap 的底层数据结构是数组 …