【评测体验】OrangePi AIpro 系统构建及性能测试

感谢香橙派社区能够邀请我评测这款开发板,祝愿国产开发板发展越来越好!在这里能够尽自己的一份力量是我的荣幸。
这篇文章是 OrangePi AIpro 开发板的评测,内容包括开发板简介、系统构建过程、系统性能测试、压缩算法性能测试、内核编译。

到手开箱

快递中包含一个开发板主体(包含散热风扇和天线)、一个 65W 的快充适配器和一根 C to C 的数据线,除此之外,还有一张 32GB 的 TF 卡,已经烧录完毕 ubuntu 系统。

如下展示了 OrangePi AIpro 开发板和 51 单片机及 3.5英寸硬盘大小的对比。

请添加图片描述

0.OrangePi AIpro 开发板简介

Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能 AI 开发板,其搭载了昇腾 AI 处理器,可提供 8TOPS INT8 的计算能力,内存提供了 8GB 和 16GB 两种版本。可以实现图像、视频等多种数据分析与推理计算,可广泛用于教育、机器人、无人机等场景。

硬件规格参数(http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/parameter/Orange-Pi-AIpro.html):

硬件名称参 数
CPU4核64位处理器+ AI处理器
四个 ARM Cortex-A76 处理器内核和一个 Arm Mali-G57 级图形处理器(https://www.audioapp.cn/bbs/archiver/?tid-222582.html)
GPU集成图形处理器
AI 算力半精度(FP16):4 TFLOPS;整数精度(INT8):8 TOPS
内存LPDDR4X:8GB/16GB(可选)
存储板载 32MB 的 SPI Flash
Micor SD 卡插槽
eMMC 插座:可外接 eMMC 模块
M.2 M-Key 接口:可接 2280 规格的 NVMe SSD 或 SATA SSD
WIFI支持双频 2.4G 和 5G WiFi
蓝牙BT4.2,模组:欧智通 6221 BUUC
以太网10/100/1000Mbps以太网;板载 PHY 芯片:RTL8211F
显示• 2xHDMI
• 1x MIPI DSI 2 Lane 接口
摄像头2x2-lane MIPI CSI camera interface,兼容树莓派 IMX210型号摄像头
USB• USB 3.0 HOST x2
• USB Type-C 3.0 HOST x1,只支持 USB3.0,不支持 USB2.0
音频3.5mm耳机孔音频输入/输出,2个HDMI音频输出
按键1x关机键、1xRESET键、1x升级键,2个拨码开关控制启动选项
40PIN40PIN 功能扩展接口,支持以下接口类型:
GPIO、UART、I2C、SPI、 I2S、PWM
风扇4pin,0.8mm间距,用于接12V风扇,支持PWM控制
电池接口2PIN电池接口,2.54mm间距,用于接3串电池,支持快充
电源Type-C PD 20V IN ,标准65W
LED 灯1个电源指示灯和1个软件可控指示灯
支持的操作系统Ubuntu22.04、openEuler22.03
产品尺寸107*68mm
重量82g

正面视图(http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-AIpro.html):

在这里插入图片描述
背面视图(http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-AIpro.html):

在这里插入图片描述

OrangePi AIpro 引脚图(http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-AIpro.html):

在这里插入图片描述

1.OpenEuler 系统构建

基于 ubuntu 主机烧写 OpenEuler 镜像到 TF 卡的方法

  1. 准备一张TF卡(推荐64GB及以上),读卡器。
  2. 下载 balenaEtcher软件,下载地址见文后参考资料小节。

在这里插入图片描述

  1. 双击打开 .AppImage 文件即可。也可以使用 dpkg 命令安装 deb 包。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

选择要烧录的 Linux 镜像文件的路径、选择TF卡的盘符、点击Flash就会开始烧录。

在这里插入图片描述

控制启动设备的两个拨码开关

Orange Pi AI Pro 支持从 TF 卡、eMMC 和 SSD(支持 NVMe SSD 和 SATA SSD)启动。具体从哪个设备启动是由开发板背面的两个拨码开关决定的(BOOT1 和 BOOT2)。
在这里插入图片描述

不同的设置状态对应的启动设备如下:

BOOT1BOOT2启动设备
LL未使用
RLSSD
LReMMC
RRTF

注意:SATA SSD 和 NVMe SSD 的启动方式对应的拨码开关的设置是一样的,这两种启动方式是通过 M2_TYPE引脚的电平自动区分的。切换拨码开关后必须重新拔插电源上下电才能让新的启动设备选项生效,不可以通过复位按键来复位系统。

启动开发板的步骤

  1. 将烧录好的 TF 卡或者 eMMC 模块 或者 SSD 插入开发板对应的插槽中。
  2. 如果想显示 Linux 系统的桌面,目前仅可以使用 HDMI0 接口连接到 HDMI 显示器。
  3. 连接好外设及 20V PD-65W Type C 电源后系统即可启动。

在这里插入图片描述

调试串口的使用方法

开发板的 uart0 串口的 tx 和 rx 引脚同时接到了两个地方。

方法一:使用 40pin 扩展接口

uart0 的 tx 和 rx 引脚接到了 40 pin 扩展接口中的 8 号和 10 号引脚,此种方式需要准备一个 3.3v 的 USB 转 TTL 模块和相应的杜邦线,然后才能正常使用开发板的调试串口功能。
在这里插入图片描述

  • USB 转 TTL 模块的 GND 接到开发板的 GND 上。
  • USB 转 TTL 模块的 RX 接到开发板的 TX 上。
  • USB 转 TTL 模块的 TX 接到开发板的 RX 上。
    在这里插入图片描述
方法二:使用 Micro-USB 接口

uart0 的 tx 和 rx 引脚也接到了开发板的 CH343P 芯片上,再通过 CH343P 芯片引出到 Micro-USB 接口上。此种方式只需要一根 Micro-USB 接口的数据线将开发板连接到电脑的 USB 接口就可以开始使用开发板的调试串口功能了,无需购买 USB 转 TTL 模块。
在这里插入图片描述

ubuntu 平台调试串口的使用方法

ubuntu 中可以使用的串口调试软件有很多,比如 putty、minicom 等。

  1. 首先使用 40pin 扩展接口及杜邦线连接 TTL 模块及电脑。(如若连接成功,/dev设备目录下一般会显示为 /dev/ttyUSB0,如果使用 Micro-USB 连接,一般为 /dev/ttyACM0
  2. 使用 putty 软件,设置串口波特率为 115200,Flow control 为 None
  3. 启动开发板即可看到串口打印信息。
账 号密 码
rootMind@123
HwHiAiUserMind@123

使用 putty 连接遇到问题:

在这里插入图片描述

解决方法:

sudo chmod 777 /dev/ttyUSB0

系统成功启动:

请添加图片描述

如下使用了 MicroUSB 方式登陆 OpenEuler 系统。
在这里插入图片描述

使用 ssh 亦可连接:
在这里插入图片描述

2.系统整体性能对比测试

使用 sysbench 工具/ LMbench 工具测试 OrangePi AIpro 开发板的性能。

sysbench是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘I/O、线程、数据库的性能测试。
Lmbench是一套简易,可移植的,符合ANSI/C标准为UNIX/POSIX而制定的微型测评工具。一般来说,它衡量两个关键特征:反应时间和带宽。Lmbench旨在使系统开发者深入了解关键操作的基础成本。

sysbench

查看命令帮助:

[HwHiAiUser@orangepiaipro Desktop]$ sysbench --help
Usage:
  sysbench [options]... [testname] [command]

Commands implemented by most tests: prepare run cleanup help

General options:
  --threads=N                     number of threads to use [1]
  --events=N                      limit for total number of events [0]
  --time=N                        limit for total execution time in seconds [10]
  --forced-shutdown=STRING        number of seconds to wait after the --time limit before forcing shutdown, or 'off' to disable [off]
  --thread-stack-size=SIZE        size of stack per thread [64K]
  --rate=N                        average transactions rate. 0 for unlimited rate [0]
  --report-interval=N             periodically report intermediate statistics with a specified interval in seconds. 0 disables intermediate reports [0]
  --report-checkpoints=[LIST,...] dump full statistics and reset all counters at specified points in time. The argument is a list of comma-separated values representing the amount of time in seconds elapsed from start of test when report checkpoint(s) must be performed. Report checkpoints are off by default. []
  --debug[=on|off]                print more debugging info [off]
  --validate[=on|off]             perform validation checks where possible [off]
  --help[=on|off]                 print help and exit [off]
  --version[=on|off]              print version and exit [off]
  --config-file=FILENAME          File containing command line options
  --tx-rate=N                     deprecated alias for --rate [0]
  --max-requests=N                deprecated alias for --events [0]
  --max-time=N                    deprecated alias for --time [0]
  --num-threads=N                 deprecated alias for --threads [1]

Pseudo-Random Numbers Generator options:
  --rand-type=STRING random numbers distribution {uniform,gaussian,special,pareto} [special]
  --rand-spec-iter=N number of iterations used for numbers generation [12]
  --rand-spec-pct=N  percentage of values to be treated as 'special' (for special distribution) [1]
  --rand-spec-res=N  percentage of 'special' values to use (for special distribution) [75]
  --rand-seed=N      seed for random number generator. When 0, the current time is used as a RNG seed. [0]
  --rand-pareto-h=N  parameter h for pareto distribution [0.2]

Log options:
  --verbosity=N verbosity level {5 - debug, 0 - only critical messages} [3]

  --percentile=N       percentile to calculate in latency statistics (1-100). Use the special value of 0 to disable percentile calculations [95]
  --histogram[=on|off] print latency histogram in report [off]

...

Compiled-in tests:
  fileio - File I/O test
  cpu - CPU performance test
  memory - Memory functions speed test
  threads - Threads subsystem performance test
  mutex - Mutex performance test

See 'sysbench <testname> help' for a list of options for each test.

OrangePi AI pro 安装 sysbench 工具:

在这里插入图片描述

CPU benchmark
[HwHiAiUser@orangepiaipro Desktop]$ sysbench --test=cpu help
WARNING: the --test option is deprecated. You can pass a script name or path on the command line without any options.
sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)

cpu options:
  --cpu-max-prime=N upper limit for primes generator [10000]

​sysbench 的 CPU 测试是在指定时间内,进行多轮次的素数计算。–cpu-max-prime 参数表示轮次数目。
测试过程:指定参数 --cpu-max-prime 值为 50000,分别在单线程、8线程、16线程、32线程、64线程和128线程下测试。记录总耗时和最大延迟。

测试命令:

sysbench --threads=XX --test=cpu --cpu-max-prime=50000  run

在这里插入图片描述

总耗时测试结果(s):

设备单线程8线程16线程32线程64线程128线程
OrangePi Ai pro10.003410.006510.015310.023010.047710.0942

最大延迟测试结果:

设备单线程8线程16线程32线程64线程128线程
OrangePi Ai pro5.1838.10108.23193.16300.41704.75
Memory benchmark
[HwHiAiUser@orangepiaipro Desktop]$ sysbench --test=memory help
WARNING: the --test option is deprecated. You can pass a script name or path on the command line without any options.
sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)

memory options:
  --memory-block-size=SIZE    size of memory block for test [1K]
  --memory-total-size=SIZE    total size of data to transfer [100G]
  --memory-scope=STRING       memory access scope {global,local} [global]
  --memory-hugetlb[=on|off]   allocate memory from HugeTLB pool [off]
  --memory-oper=STRING        type of memory operations {read, write, none} [write]
  --memory-access-mode=STRING memory access mode {seq,rnd} [seq]

sysbench内存性能测试,主要是针对不同大小的块进行连续读写或者随机读写操作。在内存性能测试中,events指的是读/写一个内存块。

测试过程:指定参数 –thread 为 单线程(线程数量), –memory-block-size 为 4K(内存块大小),–memory-total-size 为 10GB、50GB、100GB(传输数据总量),–memory-oper 为 write(写操作),–memory-access-mode 分为顺序方式。

测试命令:

sysbench --threads=1 --test=memory --memory-block-size=4K --memory-total-size=100G --memory-access-mode=seq --memory-oper=write run

在这里插入图片描述

顺序索引方式耗时结果(s):

设备10GB50GB100GB
OrangePi Ai pro1.58627.928310.0001
fileio benchmark
[HwHiAiUser@orangepiaipro ~]$ sysbench --test=fileio help
WARNING: the --test option is deprecated. You can pass a script name or path on the command line without any options.
sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)

fileio options:
  --file-num=N                  number of files to create [128]
  --file-block-size=N           block size to use in all IO operations [16384]
  --file-total-size=SIZE        total size of files to create [2G]
  --file-test-mode=STRING       test mode {seqwr, seqrewr, seqrd, rndrd, rndwr, rndrw}
  --file-io-mode=STRING         file operations mode {sync,async,mmap} [sync]
  --file-async-backlog=N        number of asynchronous operatons to queue per thread [128]
  --file-extra-flags=[LIST,...] list of additional flags to use to open files {sync,dsync,direct} []
  --file-fsync-freq=N           do fsync() after this number of requests (0 - don't use fsync()) [100]
  --file-fsync-all[=on|off]     do fsync() after each write operation [off]
  --file-fsync-end[=on|off]     do fsync() at the end of test [on]
  --file-fsync-mode=STRING      which method to use for synchronization {fsync, fdatasync} [fsync]
  --file-merged-requests=N      merge at most this number of IO requests if possible (0 - don't merge) [0]
  --file-rw-ratio=N             reads/writes ratio for combined test [1.5]

文件I/O性能测试主要是用于测试I/O的负载性能,测试过程需要进行三个阶段:准备阶段(prepare)、运行阶段(run)、清理阶段(cleanup)。在准备阶段创建测试所需数据,这些数据将在清理阶段被删除,注意在prepare和cleanup两个命令中的参数需要一致。
测试过程:–file-name=4(建文件数量)、–file-total-size=8G(要创建的文件的总大小)、–file-block-size(IO操作中使用的块大小,256、512、1024、2048),采用随机读写方式。

测试命令:

sysbench --threads=4 --test=fileio --file-num=4 --file-total-size=8G --file-block-size=N --file-test-mode=rndrw prepare
sysbench --threads=4 --test=fileio --file-num=4 --file-total-size=8G --file-block-size=N --file-test-mode=rndrw run
sysbench --threads=4 --test=fileio --file-num=4 --file-total-size=8G --file-block-size=N --file-test-mode=rndrw cleanup

在这里插入图片描述

最大延迟测试结果(s):

型号25651210242048
OrangePi Ai pro99.7598.59238.16107.67

LMBench

将 lmbench-3.0-a9.zip 工具(下载链接见参考资料小节)传入 OrangePi AI pro 开发板:

PS C:\Users\jiami\Downloads> scp .\lmbench-3.0-a9.zip HwHiAiUser@192.168.2.21:~/

增加权限:

sudo chmod -R 777 lmbench-3.0-a9

安装工具:

[HwHiAiUser@orangepiaipro lmbench-3.0-a9]$ yum install libtirpc-devel mailx

修改编译脚本:

[HwHiAiUser@orangepiaipro lmbench-3.0-a9]$ vim scripts/build
 21 LDLIBS=-lm
 22 LDLIBS="${LDLIBS} -ltirpc"
 23 CFLAGS="${CFLAGS} -I/usr/include/tirpc"

解决 ARM 适配问题,具体配置文件见链接(链接:pan.baidu.com/s/1GJ7iOSTY… 提取码:jayn)

cp config.guess lmbench-3.0-a9/scripts/gnu-os # 修正gnu-os参数,解决arm系统适配问题。

执行 make 命令:

make

编译成功:

在这里插入图片描述

在 lmbench-3.0-a9 目录的上一级目录新建 results 文件,并赋予权限。

执行 make results 命令:

make results

Mail 选项选择 no,其他选项默认即可。

执行 make results,执行后将会有以下选项提示需要设置:

  • MULTIPLE COPIES: 同时运行并行测试,对应生成结果中的 scal load 项;
  • Job placement selection: 作业调度控制方法,默认选 1,表示允许作业调度;
  • Options to control job placement: 默认选 1;
  • Memory: 设置为大于 4 倍的 cache size,该值越大结果越精确,同时运行时间越长;
  • SUBSET: 要运行的子集,包含 ALL / HARWARE / OS / DEVELOPMENT,默认选 all;
  • FASTMEM、SLOWFS、DISKS、REMOTE… 等选项,均保持默认即可。
    设置完成后测试程序开始运行,需要注意运行时间较久,需耐心等待,或先做其他事情至少 10 min 后再看。

运行结束:

在这里插入图片描述

执行 make see 命令 查看结果(vim results/summary.out):

在这里插入图片描述

OrangePi AIpro 开发板性能如下:

在这里插入图片描述

3.压缩算法性能对比测试

使用 lzbench工具测试 OrangePi AIpro 开发板的性能。

lzbench 是一个用于测试数据压缩算法性能的工具。它可以测量不同压缩算法在特定条件下的压缩和解压缩速度,以及压缩比率。通过使用 lzbench,用户可以对比不同压缩算法的性能,以便选择最适合自己需求的算法。lzbench 支持多种常见的压缩算法,包括 LZ4、LZO、Snappy、Zstandard 等,并且可以在不同的操作系统平台上进行测试。
lzbench 工具安装过程:

git clone https://github.com/inikep/lzbench && cd lzbench
make

下载数据集:

cd ..
wget https://sun.aei.polsl.pl//~sdeor/corpus/silesia.zip
mkdir silesia && cd silesia
unzip ../silesia.zip
cd ../lzbench

测试使用 zstd 压缩算法结果:

在这里插入图片描述

测试使用 lz4 压缩算法结果:

在这里插入图片描述

列出所有可用的压缩算法:

在这里插入图片描述

4.内核交叉编译及替换

内核镜像及设备树文件替换前记得查看当前内核版本号以及做好备份工作!

主机环境准备

主机系统版本

根据说明文档要求,目前 Linux 内核源码包能够在 Ubuntu 22.04 的 x64 平台上稳定编译运行,首先需要通过如下方式确保自己的主机系统版本合适。
在这里插入图片描述

更换软件源

/etc/apt/sources.list 文件中内容替换为如下文本,建议先将该系统文件备份。

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse

文件内容替换完毕后使用命令更新软件包列表。

sudo apt-get update

在这里插入图片描述

安装依赖包和交叉编译工具链
  1. 依赖包安装
sudo apt-get install -y python3 make gcc unzip pigz bison flex libncurses-dev cmake
sudo apt-get install -y squashfs-tools bc device-tree-compiler libssl-dev rpm2cpio g++
  1. 安装交叉编译工具链
    交叉编译工具链下载链接见文末参考资料。

在这里插入图片描述

新建 /opt/compiler 目录,并将 toolchain.tar.gz 文件解压到该目录:

在这里插入图片描述

解压后:
在这里插入图片描述

在配置文件 /etc/profile 中添加交叉编译工具链路径:

在这里插入图片描述

然后执行如下命令,使得环境变量生效:

source /etc/profile

然后查看交叉编译工具链的版本,如果显示有版本信息,则表明安装工具链成功。

在这里插入图片描述

下载解压 Linux 内核源码包

  1. 下载 Linux 源码
    下载链接见参考资料小节。

在这里插入图片描述

  1. 拷贝并解压
    将源码包拷贝到 /opt 目录下,然后使用命令解压。

在这里插入图片描述

编译并替换内核

在解压后的内核源码目录中使用命令,build.sh 中含有打补丁的代码。

bash build.sh kernel

在这里插入图片描述

执行后会弹出如下内核配置选项的图形界面,如果不需要修改,直接选择 Exit 退出即可。
在这里插入图片描述

编译完成后会打印如下信息:
在这里插入图片描述

编译后的 Image 文件存放于源码的 optput 目录下:
在这里插入图片描述

登录开发板 Linux 系统,将 Image 文件拷贝到开发板上,更新 OrangePi AIpro 开发板 Image 文件的命令如下(TF卡方式):

dd if=Image of=/dev/mmcblk1 count=61440 seek=32768 bs=512

编译并替换 DTB 文件

什么是 dts/dtb 文件?
DTS(Device Tree Source)和DTB(Device Tree Blob)是与嵌入式系统硬件描述相关的文件格式。

  • DTS文件是设备树的源代码文件,它以文本形式描述了系统的硬件配置。这些文件通常包含了CPU的数量和类别、内存基地址和大小、总线和桥、外设连接、中断控制器和中断使用情况、GPIO控制器和GPIO使用情况、Clock控制器等信息。
  • DTB文件是DTS文件经过编译后得到的二进制文件。它包含了设备树的完整信息,并且在系统启动时被内核加载和解析。
  • DTC(设备树编译器)用于编译DTS文件的工具,它将DTS文件转换成DTB文件。
    OrangePi AIpro 开发板使用的 DTS 文件如下:
Ascend310B-source-opi/dtb/dts/hi1910b/hi1910BL/hi1910B-default.dts

在源码目录下,使用命令:

bash build.sh dtb

编译成功后的 dtb 文件位于 output 目录下(dt.img)。
在这里插入图片描述

登陆开发板系统,将 dtb 文件拷贝到开发板上,更新 OrangePi AIpro 开发板 dtb 文件的命令如下(TF卡方式):

dd if=dt.img of=/dev/mmcblk1 count=4096 seek=114688 bs=512 # 更新主区的DTB文件
dd if=dt.img of=/dev/mmcblk1 count=4096 seek=376832 bs=512 # 更新备区的DTB文件

更换内核前:

在这里插入图片描述

替换内核后:
在这里插入图片描述


参考资料

  1. OrangePi_AI_Pro_昇腾_用户手册_v0.3.1.pdf
  2. ubuntu 22.04镜像下载链接
  3. 开发工具下载
  4. linux 源码包
  5. balenaEtcher工具
  6. lmbench-3.0-a9.zip
  7. Lmbench 的使用方法以及解析运行结果
  8. lzbench安装与使用

遇到问题

Ubuntu22.04 在 VMware 17 无法实现拖放复制操作解决办法?
Ubuntu22.04 在 VMware 17 无法实现拖放复制操作解决办法_vmware workstation ubuntu 快捷键 失效-CSDN博客

各(老)版本 ubuntu 镜像下载?
https://old-releases.ubuntu.com/releases/

修改虚拟机磁盘空间方法?
建议分配 80GB 虚拟机磁盘空间。
https://www.cnblogs.com/codingdog/p/14879313.html

使用 40pin 接口 TTL 调试时,有输出,但是输入无反应?

OrangePi_AI_Pro_昇腾_用户手册_v0.3.1.pdf 手册问题

  1. P157. 然后在配置文件中增加交叉编译工具链路径。

在这里插入图片描述

实际命令应该为:

export PATH=/opt/compiler/toolchain/bin:$PATH:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分析和设计算法

目录 前言 循环不变式 n位二进制整数相加问题 RAM模型 使用RAM模型分析 代码的最坏情况和平均情况分析 插入排序最坏情况分析 插入排序平均情况分析 设计算法 分治法 总结 前言 循环迭代&#xff0c;分析算法和设计算法作为算法中的三个重要的角色&#xff0c;下面…

【深度 Q 学习-01】 Q学习概念和python实现

文章目录 一、说明二、深度 Q 学习概念三、python实现四、结论 关键词&#xff1a;Deep Q-Networks 一、说明 在强化学习 &#xff08;RL&#xff09; 中&#xff0c;Q 学习是一种基础算法&#xff0c;它通过学习策略来最大化累积奖励&#xff0c;从而帮助智能体导航其环境。它…

2024年618网购节各大电商超级红包二维码集合

一年一度的电商618网购节又要来了&#xff0c;下面收集了淘宝/京东/拼多多的618红包二维码&#xff0c;手机扫描或识别即可每天领红包&#xff0c;可参考好物分享中的商品下单&#xff1a; 淘宝618超级红包&#xff1a;即日起至2024.6.10&#xff0c;每天可领一次 京东618无门…

P9 【力扣+知识点】【算法】【二分查找】C++版

【704】二分查找&#xff08;模板题&#xff09;看到复杂度logN&#xff0c;得想到二分 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0…

RUST 和 GO 如何管理它们的内存

100编程书屋_孔夫子旧书网 Go 中的内存管理 Go 中的内存不会在缓存键被驱逐时立即释放。 相反&#xff0c;垃圾收集器会经常运行以发现任何没有引用的内存并释放它。 换句话说&#xff0c;内存会一直挂起&#xff0c;直到垃圾收集器可以评估它是否真正不再使用&#xff0c;而…

SpringCloud:Nacos配置管理

程序员老茶 &#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; P   S : 点赞是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#…

01--nginx基础

前言&#xff1a; 本文用来整理一下nginx的用法&#xff0c;应该是本人中间件专栏的第一篇文章&#xff0c;这里开始概念和实操将会同样重要&#xff0c;面试时基本概念的理解非常重要&#xff0c;深有体会&#xff0c;不会再让概念成为压死骆驼的稻草。 1、nginx简介 Nginx…

vue连接mqtt实现收发消息组件超级详细

基本概念&#xff1a; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种基于发布/订阅模式的轻量级消息传输协议&#xff0c;专为低带宽、高延迟或不稳定的网络环境设计。以下是MQTT实现收发消息的基本原理&#xff1a; 客户端-服务器模型&#xff1a…

【数据结构】-- 栈

栈 引入&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的元素遵循先进后出的原则&#xff0c;先入栈的元素总是先后出栈。 压栈&#xff1a;栈的插入操作叫…

HCIP-Datacom-ARST自选题库__OSPF多选【62道题】

1.如图所示&#xff0c;路由器所有的接口开启OSPF&#xff0c;图中标识的IP地址为设备的LoopbackO接口的IP地址&#xff0c;R1、R2、R3的LoopbackO通告在区域1&#xff0c;R4的Loopback0通告在区域0&#xff0c;R5的LoopbackO通告在区域2&#xff0c;下列哪些IP地址之间可以相互…

Docker CIG使用

Docker CIG是什么 CIG为&#xff1a;CAdvisor监控收集、InfluxDB存储数据、Granfana图表展示 这个组合是一个常见的监控 Docker 容器的解决方案,它包括以下三个组件: cAdvisor (Container Advisor): cAdvisor 是一个开源的容器资源监控和性能分析工具。它能够收集有关正在运行的…

【Linux系统】进程间通信

本篇博客整理了进程间通信的方式管道、 system V IPC的原理&#xff0c;结合大量的系统调用接口&#xff0c;和代码示例&#xff0c;旨在让读者透过进程间通信去体会操作系统的设计思想和管理手段。 目录 一、进程间通信 二、管道 1.匿名管道 1.1-通信原理 1.2-系统调用 …

【VTKExamples::Utilities】第十五期 ShepardMethod

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ShepardMethod,并解析接口vtkShepardMethod,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ…

HTML+CSS 圆形菜单

效果演示 实现了一个圆形菜单的效果,点击菜单按钮后,菜单项会从菜单按钮中心点向外展开,并且菜单项上有文字链接。可以将这段代码的效果称为“圆形菜单展开效果”。 Code <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8…

实战15:bert 命名实体识别、地址解析、人名电话地址抽取系统-完整代码数据

直接看项目视频演示: bert 命名实体识别、关系抽取、人物抽取、地址解析、人名电话地址提取系统-完整代码数据_哔哩哔哩_bilibili 项目演示: 代码: import re from transformers import BertTokenizer, BertForTokenClassification, pipeline import os import torch im…

(IDEA修改Java版本)java: 警告: 源发行版 X 需要目标发行版 X

搜索关键词&#xff1a;一致、发行 错误信息 其他错误&#xff1a; java: 错误: 不支持发行版本 6 java: -source 1.5 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式) 思路 有两个地方要检查&#xff0c;JDK版本保持一致即可。 比如统一用JDK8或…

[排序算法]4. 图解堆排序及其代码实现

先来看看什么是堆? 堆是一种图的树形结构&#xff0c;被用于实现“优先队列”&#xff08;priority queues&#xff09; 注:优先队列是一种数据结构&#xff0c;可以自由添加数据&#xff0c;但取出数据时要从最小值开始按顺序取出。 在堆的树形结构中&#xff0c…

linux安装mysql后,配置mysql,并连接navicat软件

Xshell连接登陆服务器 输入全局命令 mysql -u root -p 回车后&#xff0c;输入密码&#xff0c;不显示输入的密码 注意mysql服务状态&#xff0c;是否运行等 修改配置文件my.cnf&#xff0c;这里没找到就找my.ini&#xff0c;指定有一个是对的 find / -name my.cnf 接下…

书籍学习|基于SprinBoot+vue的书籍学习平台(源码+数据库+文档)

书籍学习平台 目录 基于SprinBootvue的书籍学习平台 一、前言 二、系统设计 三、系统功能设计 1平台功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 5.2.3作者功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …

mysql数据导入navicat中,报错提示1067

MySQL导入问题&#xff1a; 报错1067 - Invalid default value for 字段名 由于数据库版本升级&#xff0c;老数据库的数据文件导出以后&#xff0c;在新版本的数据库上执行会报错 这种问题多是由于默认值不兼容引起的&#xff0c;我们可以通过修改sql_mode来解决这个问题 由…