Ubuntu 下使用 Scons 交叉编译嘉楠堪智 CanMV K230 大小核 Coremark 程序

在 Ubuntu 下使用 SCons 进行交叉编译嘉楠堪智 CanMV K230 大小核(不同的玄铁 C908 核心)的 C 程序,以 Coremark 程序为例,顺便测试一下大小核和编译器的性能。

2024年3月14日,嘉楠科技宣布推出了全球首款支持 RISC-V Vector 1.0 标准的商用量产端侧 AIoT 芯片 K230,我们顺便了解一下其采用的玄铁 C908 核心,并测试一下实际的表现。

玄铁 C908 采用 9 级双发按序流水线,典型工作频率>2GHz,通过指令融合技术进一步提升流水线效率,实现了卓越的能效比。兼容 RVA22 标准,同时兼容 RISC-V 最新 Vector1.0 标准以进一步提升 AI 算力。可以应用在行业 IPC、智能交互、AR/VR、无线通讯等场景。

阿里 T-Head 提供了与 C906 单发按序处理器的性能对比:

玄铁 C908 的运行频率最高可达 2GHz,采用的是台积电 12 纳米工艺,单核动态功耗低至 52.8mW/GHz。在相同频率和工艺限制的典型场景下,玄铁 C908 的能效比玄铁 C906 提升了 20% 以上。

RISC-V Vector Extension 1.0 确实有助于 AI 工作负载,在相同条件下,对使用 INT4 数据类型的唤醒词检测、图像分类、关键字定位和 MLPerf 微型 V0.7 推理性能测试的异常检测中,C908 比 C906 快了大约 2 到 3.5 倍。

一、安装 SCons

可以使用 apt 包管理器安装 SCons:

        sudo apt update

        sudo apt install scons

二、准备交叉编译工具链

k230_sdk 中提供了工具链,buildroot package 和 AI package,可用如下命令下载:

        cd k230_sdk

        source tools/get_download_url.sh && make prepare_sourcecode

嘉楠堪智 CanMV K230 大小核是不同的玄铁 C908 核心,嘉楠给出了不同的工具链:

  •     大核 rt-samrt 工具链:

        k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu

这个工具链使用 Musl libc 作为 C 标准库,而不是更常见的 glibc。Musl libc 是一种轻量级的 C 库,旨在提供与 glibc 类似的 API,但更小、更快、更简单,非常适合嵌入式系统或需要减少程序大小的环境。

  •     小核 linux 工具链:

        k230_sdk/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0

这个工具链使用 glibc 作为 C 标准库。glibc 是 Linux 系统上最常用的 C 标准库,提供了丰富的功能和良好的兼容性。

也可通过以下链接下载工具链:

wget https://download.rt-thread.org/rt-smart/riscv64/riscv64-unknown-linux-musl-rv64imafdcv-lp64d-20230222.tar.bz2


wget https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1659325511536/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0-20220715.tar.gz

三、准备 Coremark 程序

1. 下载代码

        git clone https://github.com/eembc/coremark.git

        cd coremark/

2. 移植代码

将 simple 目录下的 core_portme.c 和 core_portme.h 拷贝到当前 coremark 目录下,按照下面做修改:

四、编写 SConstruct 文件

SConstruct 文件是 SCons 的构建脚本。编写一个 SConstruct 文件,指定源文件、构建目标、编译器和其他构建选项。

1. 小核 Linux 的 SConstruct 文件

如下所示:

# 引入SCons的环境  
import os  # 交叉编译工具链的路径  
toolchain_path = '/home/xu/k230_sdk/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin'  # 设置环境变量  
env = Environment(ENV={'PATH' : os.environ['PATH'] + ':' + toolchain_path})  # 设置交叉编译器  
env['CC'] = 'riscv64-unknown-linux-gnu-gcc'  
env['LINK'] = '$CC'  # 添加编译和链接选项(根据你的需要调整)  
#env['CFLAGS'] = ['-mcmodel=medany', '-march=rv64imafdcv', '-mabi=lp64d']  
#env['LINKFLAGS'] = env['CFLAGS']  env.Append(CCFLAGS=['-O2'])
#env.Append(DEFS=['PERFORMANCE_RUN=1', 'ITERATIONS=100000'])# 假设你的CoreMark源文件在'src'目录下  src_files = Glob('*.c') # 构建程序(假设你的目标文件名为'coremark')  
env.Program(target='coremark_linux.elf', source=src_files)

2. 大核 RT- smart 的 SConstruct 文件:

如下所示:

# 引入SCons的环境  
import os  # 交叉编译工具链的路径  
toolchain_path = '/home/xu/k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin'  # 初始化环境变量  
env = Environment(tools=['default', 'gcc'], ENV={'PATH' : os.environ['PATH'] + ':' + toolchain_path})  # 设置交叉编译器  
env['CC'] = 'riscv64-unknown-linux-musl-gcc'  
env['LINK'] = '$CC'  
#设置编译器标志
env.Append(CCFLAGS=['-O2','-mcmodel=medany', '-march=rv64imafdcv', '-mabi=lp64d'])
#设置链接器标志
env.Append(LINKFLAGS=['-mcmodel=medany', '-march=rv64imafdcv', '-mabi=lp64d','-T', '/home/xu/k230_sdk/src/big/mpp/userapps/sample/linker_scripts/riscv64/link.lds','-L/home/xu/k230_sdk/src/big/rt-smart/userapps/sdk/rt-thread/lib','-Wl,--whole-archive', '-lrtthread', '-Wl,--no-whole-archive','-n', '--static'])env['CPPPATH'] = ['#']  # 如果有头文件路径需要添加  
env['LIBPATH'] = [  
#    '/home/xu/k230_sdk/src/big/rt-smart/userapps/sdk/rt-thread/lib',  '/home/xu/k230_sdk/src/big/rt-smart/userapps/sdk/lib/risc-v/rv64',  '/home/xu/k230_sdk/src/big/rt-smart/userapps/sdk/rt-thread/lib/risc-v/rv64'  
]  
env['LIBS'] = ['rtthread']  
env['RPATH'] = []  # 如果有需要添加的运行时搜索路径  # 添加源文件  
src_files = Glob('*.c')  # 假设CoreMark源文件在目录下  # 设置链接选项(针对-Wl, --whole-archive 和 -Wl, --no-whole-archive)  
#env.Append(LINKFLAGS=['-Wl,--whole-archive', '-lrtthread', '-Wl,--no-whole-archive'])  
#env.Append(LINKFLAGS=['-Wl,--start-group', '-lrtthread', '-Wl,--end-group'])  #编译源文件
#objects = [env.Object(file) for file in src_files]# 构建程序  
env.Program(target='coremark_rt.elf', source=src_files)  # 如果需要额外的构建步骤或目标,可以在这里添加

 编译参数:

  • -mcmodel=medany:

    • mcmodel 代表“代码模型”(code model)。在 RISC-V 架构中,代码模型决定了代码和数据的布局方式,以及编译器如何生成对它们的引用。
    • medany 程序及其静态定义的符号必须位于单个4 GiB地址范围内。使用 auipc 和 addi 指令对来生成地址。使用 auipc 指令取符号地址的高 20 位。auipc 配合其它包含低 12 位立即数的指令后,可以访问当前 PC 的前后 2GiB (PC - 2GiB ~ PC + 2GiB) 的地址空间。程序可以是静态链接或动态链接。
    • medlow 程序及其静态定义的符号必须位于单个2 GiB地址范围内,并且必须位于 -2 GiB 到 +2 GiB 的绝对地址之间。使用 lui 和 addi 指令对来生成地址。使用 lui 指令取符号地址的高 20 位。 lui 配合其它包含低 12 位立即数的指令后,可以访问的地址空间是 -2GiB ~ 2GiB。程序可以是静态链接或动态链接。

  • -march=rv64imafdcv:

    • march 标志用于指定RISC-V架构的版本或变种。
    • rv64imafdcv 指示编译器生成针对64位RISC-V(RV64)的代码,并且包含I(基本整数指令集)、M(乘法/除法指令)、A(原子指令)、F(单精度浮点指令)、D(双精度浮点指令)、C(压缩指令集)和V(向量指令集)等指令集的代码。
    • 这个选项确保你的代码可以利用 RISC-V 的这些特定功能,从而可能提供更好的性能或功能。
  • -mabi=lp64d:

    • mabi 标志用于指定应用程序二进制接口(ABI)。ABI 定义了如何在机器代码级别上调用函数、传递参数、返回结果以及数据的内存布局。
    • lp64d 是一种ABI,其中 “lp64” 表示 longs 和指针都是 64 位,而 “d” 表示双精度浮点数是 64 位。这是 RISC-V 架构中常用的 ABI 之一,它提供了与许多其他 64 位架构(如x86_64)相似的数据模型。

五、运行 Scons 编译:

进入 k230_sdk/src/big/rt-smart/userapps 目录,编译程序:

xu@HP:~/k230_sdk/src/big/rt-smart/userapps$scons --directory=coremark

小核 Linux 编译:

大核 RT- smart  编译:

六、运行 coremark:

标号为 USB 的端口连接到电脑后,会识别为 U 盘 CanMV ,把产生的文件拷贝到 U 盘上:

在串口终端里,ttyACM1 对应 Linux 小核,ttyACM2 对应 rt-smart 大核,可以通过 sharefs 目录交换文件:

小核 Linux 执行程序:

        ./coremark_linux.elf

大核 RT- smart 执行程序:

        msh /sdcard/app>./coremark_rtO3.elf

七、小结:

阿里 T-Head 表示,玄铁 C908 的性能介于 2020 年和 2019 年分别推出的 C906 和 C910 内核之间。玄铁 C906 的 coremark 分数是:3.40 CoreMark/MHz,玄铁 C910 的 coremark 分数是:7.10 CoreMark/MHz,StarFive U74 的 coremark 分数是:5.09 CoreMark/MHz,玄铁 C908 小核的 coremark 分数是:4.29 CoreMark/MHz?

嘉楠堪智 CanMV K230 800MHz 小核的 coremark 分数是:3433(4.29 CoreMark/MHz),1.6GHz 大核的 coremark 分数是:4522(2.83 CoreMark/MHz)?(不知道哪个设置有问题,应该是:8368(5.23 CoreMark/MHz))

                                                                                         老徐,2024/5/8

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国历史朝代顺序表(全)

三皇五帝始,尧舜禹相传; 夏商与西周,东周分两段; 春秋和战国,一统秦两汉; 三分魏蜀吴,二晋前后沿; 南北朝并立,隋唐五代传; 宋元明清后,皇朝…

秋招算法复习——5/15——三数之和

文章目录 问题描述思路分析实现代码分析与总结 问题描述 思路分析 三个之和为零,即a b c 0 ,将这个拆解为b c -a ,那就变成了两数之和问题。两重指针的模版来解决。 虽然列表中存在重复的数字,但是结果不允许存在重复的组合…

从开发板导出根文件系统并修改(Ubuntu)

前面提到过基于ubuntu-base去构建根文件系统基于Ubuntu-base构建根文件系统-CSDN博客,但是有时候我们并不需要重头开始,可以基于现有的根文件系统做调整。又或者我们直接在出厂的系统上去搭建好自己的运行环境并且编译出自己想要的程序,现在要…

SWAT模型高阶应用暨SWAT模型无资料地区建模、不确定分析及气候、土地利用变化对水资源与面源污染影响分析

原文链接:SWAT模型高阶应用暨SWAT模型无资料地区建模、不确定分析及气候、土地利用变化对水资源与面源污染影响分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247604401&idx4&snd2d39846dce07bee765c820de1cf92f3&chksmfa821956cdf5904…

如何通过汽车制造供应商协同平台,提高供应链的效率与稳定性?

汽车制造供应商协同是指在汽车制造过程中,整车制造商与其零部件供应商之间建立的一种紧密合作的关系。这种协同关系旨在优化整个供应链的效率,降低成本,提高产品质量,加快创新速度,并最终提升整个汽车产业的竞争力。以…

【合成孔径雷达】合成孔径雷达的多视角理解和时/频成像算法的统一解释

文章目录 一、什么是雷达成像(1)主要的遥感探测手段:光学、红外和雷达(2)从数学的角度:雷达成像主要研究什么?数据采集: y T x n yTxn yTxn信息提取: y − > x ? y…

git 拉取指定目录

指令方式 打开 git 自带的Git Bash 工具 以拉取github中 fastjson 的 /src/test/java/oracle/sql/ 目录为例 1.创建文件夹和git 初始化 cd D:/Program\ Files mkdir fastjson cd fastjson git init 2.设置允许克隆子目录 git config core.sparsecheckout true 3.添加远程…

稚晖君独家撰文:具身智能即将为通用机器人补全最后一块拼图

具身智能新纪元。 *本文为稚晖君独家供稿,「甲子光年」经智元机器人授权发布。稚晖君本名彭志辉,先后任职OPPO、华为,现为智元机器人CTO、首席架构师。 在ChatGPT之后,又一个大模型概念火了——具身智能(Embodied AI)。 在学术界,图灵奖得主、上海期智研究院院长姚期…

Linux|如何允许 awk 使用 Shell 变量

引言 当我们编写 shell 脚本时,我们通常会在脚本中包含其他较小的程序或命令,例如 awk 操作。就 Awk 而言,我们必须找到将一些值从 shell 传递到 Awk 操作的方法。 这可以通过在 Awk 命令中使用 shell 变量来完成,在本文中&#x…

Digimat在电池壳体SMC复合材料成型工艺中的应用

SMC工艺介绍及挑战 SMC(Sheet Molding Compound的缩写,即片状模塑料)是一种复合材料制造工艺。该工艺可以有效地代替金属,实现车辆轻量化目标。该工艺不仅能够显著降低车身重量,而且设计灵活,操作简单、易…

企业数字化转型规划设计(107页PPT)

一、资料介绍 《企业数字化转型规划设计》这份详尽的107页PPT资料,是对企业数字化转型的全方位、系统性规划设计的深度解读。该资料从数字化转型的必要性、现状分析、目标设定、实施路径、技术支持到风险评估等多个维度,为企业提供了一套完整且实用的操…

软信天成:业务流程管理驱动企业数字化转型

近日,在国家发展改革委办公厅、国家数据局综合司联合印发的《数字经济2024年工作要点》中,明确强调了本年度大力推进重点领域数字化转型,营造数字化转型生态的战略举措,标志着国家对于企业数字化转型的高度重视与积极倡导。 企业…