Lichee_RV学习系列---移植dhrystone

news2025/1/18 21:19:46

系列文章目录

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开源的代码,他是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=-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
	${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 dry2nr

dry2o: dry.h dry1.c dry2.c
	${CC} -c -O ${CFLAGS} dry1.c -o dry1.o
	${CC} -O ${CFLAGS} dry2.c dry1.o ${LFLAGS} -o dry2o

clean:
	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# ./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]:       0
        should be:   7
Arr_2_Glob[8][7]:    50000010
        should be:   Number_Of_Runs + 10
Ptr_Glob->
  Ptr_Comp:          0x6417260
        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:          0x6417260
        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.3
Dhrystones per Second:                         3003003

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

root@MaixLinux:/mnt/dhrystone# ./dry2

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:
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]:    5000010
        should be:   Number_Of_Runs + 10
Ptr_Glob->
  Ptr_Comp:          0x2db27260
        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:          0x2db27260
        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.9
Dhrystones per Second:                         1126126

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/155457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink源码解析一之RPC原理解析

在阅读 Flink 源码过程中,如果你见到有这种类型的代码,其实就是在发送 RPC 请求 // resourceManagerGateway 就可以理解成: 当前节点中,对于 ResourceManager 代理对象的封 装 resourceManagerGateway.requestSlot(); // 代码跳转到:resourceManager.requestSlot()…

C++20标准下的左值与右值

C20标准下的左值与右值一、什么是左值与右值二、左值引用三、右值引用四、值类别五、标准库 move 函数5.1 用 static_cast将左值转换为右值5.2 使用 std::move 将左值转换为右值一、什么是左值与右值 左值&#xff1a;左值可以出现在赋值语句的左边或者右边右值&#xff1a;右…

Java设计模式-装饰者模式Decorator

介绍 装饰者模式的核心思想是通过创建一个装饰对象&#xff08;即装饰者&#xff09;&#xff0c;动态扩展目标对象的功能&#xff0c;并且不会改变目标对象的结构&#xff0c;提供了一种比继承更灵活的替代方案。需要注意的是&#xff0c;装饰对象要与目标对象实现相同的接口&…

VisualBox解决CentOS中yum安装失败的问题

怎么说呢&#xff0c;花了一个下午一个上午的时间&#xff0c;总算把这条命令运行成功了&#xff1a; yum install wget -y 打怪兽途中遇到了几个问题&#xff0c;总结一下&#xff1a; 1.ping 啥ip都是unkown&#xff0c;还有一种情况&#xff0c;就是ping之后就一直卡在那…

C++计算机课程设计 学生成绩管理系统 研究报告

课程设计内容 2.1 学生成绩管理系统 2.1.1 内容 主菜单模块 该模块主要用来实现整个系统的流程。主界面提供用户选择并调用各个子模块。 输入模块 当初次使用系统时&#xff0c;学生信息需要从键盘逐个输入。学生信息由学生的学号、姓名、性别、高等数学、英语、计算机和平均…

Qt基于CTK Plugin Framework搭建插件框架--CTK服务工厂

一、前言 注册服务的时候能够用服务工厂来注册&#xff1b; 访问服务getServeice中的plugin参数是执行ctkPluginContext::getService(const ctkServiceReference&)的插件&#xff0c;从而工厂根据执行的不同插件名称返回不同的服务实现 服务工厂的作用 在服务中可以知道…

达摩院2023十大科技趋势发布,生成式AI将进入应用爆发期

1月11日&#xff0c;达摩院2023十大科技趋势发布&#xff0c;生成式AI、Chiplet模块化设计封装、全新云计算体系架构等技术入选。达摩院认为&#xff0c;全球科技日趋显现出交叉融合发展的新态势&#xff0c;尤其在信息与通信技术&#xff08;ICT&#xff09;领域酝酿的新裂变&…

【关于Linux中----进程间通信方式之管道】

文章目录一、什么是管道二、匿名管道三、命名管道一、什么是管道 进程间通信主要目的为以下几点 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息…

STL forward_list 模拟实现

forward_list 概述 forward_list 是 C 11 新增的容器&#xff0c;它的实现为单链表。 forward_list 是支持从容器中的任何位置快速插入和移除元素的容器&#xff0c;不支持快速随机访问。forward_list 和 list 的主要区别在于&#xff0c;前者的迭代器属于单向的 Forward Ite…

二分法讲解

目录 一、前言 二、二分法理论 1、引导&#xff1a;猜数游戏 2、理论背景&#xff1a;非线性方程的求根问题 1&#xff09;非线性方程的近似解 2&#xff09;搜索法和二分法 3、用二分的两个条件 4、二分法复杂度 三、整数二分 1、在单调递增序列中找 x 或者 x 的后继…

使用python-pptx创建PPT演示文档功能实践

python对PPT演示文档读写&#xff0c;是通过第三方库python-pptx实现的&#xff0c;python-pptx是用于创建和更新 PowerPoint&#xff08;.pptx&#xff09;文件的 Python 库。 关于PPT演示文档与幻灯片模板的内容不是本文的重点&#xff0c;在此略过。 1. PPT基本结构在pyth…

Sophus降维、升维与欧拉角、旋转向量的爱恨情仇

0. 简介 在面对二维与三维之间的转换时&#xff0c;我们常常会困惑该如何去转换&#xff0c;在G2O中存在有理想的坐标转换工具&#xff0c;但是在Sophus中却缺乏这样的手段。之前在Sophus处简要的介绍了一下SE(2)与SE(3)的转换&#xff0c;最近发现之前的文章这部分需要拿出来…

Leetcode:654. 最大二叉树(C++)

目录 问题描述&#xff1a; 实现代码与解析&#xff1a; 直接模拟&#xff08;递归)&#xff1a; 原理思路&#xff1a; 索引版本&#xff1a; 问题描述&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&a…

Thymeleaf从入门到清晰使用

文章目录什么是thymeleaf&#xff1f;第一个Thymeleaf程序Thymeleaf详解配置常用标签最后什么是thymeleaf&#xff1f; 模板引擎&#xff1a; 前端交给我们的页面&#xff0c;是html页面&#xff0c;如果是以前开发&#xff0c;我们需要把他们转成jsp页面&#xff0c;jsp的好处…

ABB AC500 系列 PLC 与上位机iFix 的通讯配置

ABB PLC IP 及 MODBUS TCP/IP 协议设置 通过 IP config tool 配置设备 IP 在 软件中&#xff0c;有 3 种方式可以进入 IP config tool 的配置界面  双击 IP_settings&#xff0c;点击 IP config tool&#xff0c;即可进入 IP config tool 界面 点击菜单栏的 Tool→IP confi…

k8s 微服务spring boot JVM 监控

目录 1.前言 1.1 JVM监控方案 1.2 接入操作步骤 2. 服务开启actuator prometheus监控 2.1 示例参考添加依赖 2.2 配置prometheus监控 3 配置 prometheus 监控 4 配置jvm grafana dashboard 1.前言 服务 部署环境 监控 spring-demo k8s v1.22 Prometheus Operator …

进程相关概念

1、什么是程序&#xff0c;什么是进程&#xff0c;有什么区别 程序是静态的概念。例如&#xff1a;gcc xxx.c -o pro&#xff0c;磁盘中生成pro文件&#xff0c;叫做程序&#xff08;还未运行起来&#xff09; 进程是程序的一次运行活动&#xff0c;也就是程序跑起来了&#xf…

【Linux】信号机制(非实时信号)

目录 前言 一.信号的概念以及产生 1.什么是信号 2.信号分为两类 3.查看信号的命令 4.信号如何产生 1).通过软件产生 2).通过硬件产生 3).通过键盘组合键产生 二.信号的发送以及保存 1.信号如何发送 2.信号如何保存 1).概念 2).底层实现结构&&内核中的实现…

WampServer服务器设置控件

WampServer服务器设置控件 WampServer是一个web开发环境&#xff0c;是一个用于Windows操作系统的类似服务器的软件&#xff0c;由Romain Bourdon构建。该工具允许您开始构建web应用程序&#xff0c;并在Windows上使用Apache服务器2、PHP编程语言和MySQL数据库在本地网络上启动…

java 实现 springboot项目 使用socket推送消息,前端实时进行接收后端推送的消息

1 后端 1.1 添加依赖 在我们的springboot项目里面&#xff0c;添加依赖&#xff1b; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.7.0</version>…