【性能测试】stream内存带宽性能测试工具(飞腾2000+/64的CPU+麒麟信安的优化过程)

背景:

需要在飞腾2000+CPU上使用麒麟信安系统进行Stream测试内存带宽,参考了【性能测试】stream内存带宽性能测试工具_stream测试-优快云博客,对增加带一部分优化的方法和论证结果和一点麒麟信安的终端设置方法(见问文章最后)。

飞腾2000+/64核心CPU,具备L2缓存32MB,每四个核心共享2MB缓存;实物具备8通道内存,运行频率为2400MHz;理论上的测试带宽应该按照如下公式进行计算;

內存理论带宽值(MB/s) = 內存实际运行频率(MHz) × channel总数 × 64bit ÷ 8

内存理论带宽:2400MHz x 8 x 64bit ÷ 8 =  153600MB = 150 GB

使用研发提供编译及测试方法,未进行优化前测试出,带宽为47-80GB左右,且无法稳定每一次的测试结果。

研发提供的测试方法代码如下:

#!/bin/bash
gcc -O2 -fopenmp -mcmodel=large -DNTIMES=20 -DSTREAM_ARRAY_SIZE=267300000 -o stream_multi stream.c
export OMP_NUM_THREADS=64
export GOMP_CPU_AFFINITY=0-63
./stream_multi

对于选项参数需要依次了解,有针对性的进行调整;

引用内容介绍

【性能测试】stream内存带宽性能测试工具_stream测试-优快云博客

Stream测试子项

Stream测试子项
测试项目访存操作操作次数
Copy(复制)c[i] = a[i]1R1W
Scale(尺度变换)b[i] = scalar * c[i]1R1W
Add(矢量求和)c[i] = a[i] + b[i]2R1W
Triad(符合矢量求和)a[i] = b[i] + scalar * c[i]2R1W

测试结果,理论上应该3次存取的带宽大于2次存取带宽,

测试结果一般的规律是Add > Triad > Copy > Scale。一次Add操作需要访问三次内存(两个读操作,一个写操作),Triad操作也需要三次访问内存, Copy和Scale操作需要两次访问内存。单位操作内,访问内存次数越多,越能够掩盖访存延迟,带宽越大。
单核Stream测试,影响的因素除了内存控制器能力外,还有Core的ROB、Load/Store对其影响,因此不是单纯的内存带宽性能测试。
而多核Stream测试,通过多核同时发出大量内存访问请求,能够更加饱和地访问内存,从而测试到内存带宽的极限性能。


源码版本

 5.10 版本。


硬件配置

飞腾2000+/64的CPU,八通道国产贴片内存,2400MHz;


软件配置

    gcc,建议使用 gcc-7.3 以上版本编译器
    glibc,glibc-2.27 以上版本的 libc 库

编译安装

下方结合个人理解及实际测试对参数及方法进行调整;

gcc编译

命令参数
选项参数解释备注
-DOFFSET=4096数组的偏移,一般不设置。
-fopenmp

采用 gcc 自带的 OpenMP ,提供了很丰富的指令,对于同步共享变量、合理分配负载等任务,都提供了有效的支持。测试内存带宽的时候采用多个线程并行测试,这个选项能够有效的提高内存的带宽。
适应多处理器环境;开启后,程序默认线程为CPU线程数,也可以运行时动态指定运行的进程数 。例如:export OMP_NUM_THREADS=12 #12为自定义的要使用的处理器数

多线程编译时使用
-DNTIMESstream 测试值会随着计算机各种状态有一定波动,对波动要求较严格时可适当增大-DNTIMES 的值,测试结果取多次测试的最优值。执行的次数,并从这些结果中选最优值。
-DSTREAM_ARRAY_SIZE=
指定测试数组a[]、b[]、c[]的大小(Array size)。该值对测试结果影响较大(5.9版本默认值2000000,。若stream.c为5.10版本,参数名变为-DSTREAM_ARRAY_SIZE,默认值10000000)。注意:必须设置测试数组大小远大于CPU 最高级缓存(一般为L3 Cache)的大小,否则就是测试CPU缓存的吞吐性能,而非内存吞吐性能。

此值计算得到的数组大小需要超过 CPU 最大缓存的若干倍,避免数据量太小导致只测试到 cache 读写的性能。
比如双路服务器 2 CPU,最大缓存为 单个 CPU 的 L3 cache x2。
单位为字节 Byte,除以 8 是因为 STREAM_ARRAY_SIZE 为 double 类型,每个 double 类型占用 8 Byte。

                      

推荐计算公式:

{最高级缓存X MB}×1024×1024×4.1×CPU路数/8,结果取整数

按如下公式指定此值:L2 Cache (所有CPU) Byte * 1 * /8
如 1* 飞腾2000+ L2 Cache = 32MB * 1= 32 * 1024 * 1024 * 1,
则指定-DN=32 * 1024 * 1024 * 1  /8=4194304,至少要超出这个数4.1倍以上才能表明测试结果受到cache缓存空间影响较小。(实际测试)
 

-mcmodel=large-DN=x ,-DSTREAM_ARRAY_SIZE=,数组一定大时需要指定,否则编译不过。当单个Memory Array Size 大于2GB时需要设置此参数。
-O2

GCC 的全局优化选项,启用 O3 级别优化。
还可以再加入参数 -ftree-vectorize 启用矢量化。
优化级别,优化级别分为O0\O1\O2\O3,O0是无优化,O1是减少代码尺寸和执行时间,O2是几乎执行所有优化而不考虑代码尺寸和时间,O3是优化级别最高,可能增加代码尺寸。在stream内存带宽测试中,一般情况下建议选择O2或者O3,两者测试结果差别不大。

需要根据实际测试结果进行选择O2或者O3
-mtune=native针对CPU指令的优化,此处由于编译机即运行机器。故采用 native 的优化方法。
使用 -mtune =native 将在所选指令集的约束下生成针对本地计算机优化的代码。
启用此项有可能降低测试性能数据。
-march=native使用 -march =native 将启用本地计算机支持的所有指令子集(因此编译的程序可能无法在其他计算机上运行)启用此项有可能降低测试性能数据。

 

关于-DSTREAM_ARRAY_SIZE=在源码stream.c中带解释。

测试
基本测试命令

export OMP_NUM_THREADS=64    #为运行的线程数,建议为 CPU 核的个数
export GOMP_CPU_AFFINITY=0-63  #测试运行线程的 CPU 亲和性(绑核)
gcc -O2 -fopenmp -mcmodel=large -DNTIMES=20 -DSTREAM_ARRAY_SIZE=25165824 -o stream_multi stream.c
./stream_multi

关于DSTREAM_ARRAY_SIZE=25165824这一部分,是经过对4194304的6倍(7倍实验反而降低带宽)的依次实验得出,比这个数再高,对应的带宽反而会降低,所以综上所述,选择此参数对此实物具备意义,但是对应其他设备需要重新进行摸底实验以确定参数。

上方命令的测试结果,

Copy/Scale稳定在88 GB左右,Add及Triad稳定在93-95GB之间,可以做到得到稳定的测试结果。

麒麟信安设置终端快捷键及设置usb上网ip自动分配的情况。

关于麒麟信安设置终端快捷键

按win键,选择设置,快捷键设置,选择“打开终端”,选择自己喜欢的快捷键进行设置,

通过连接手机后,手机端开启热点,使用USB共享网络,终端界面选择ifconfig -a,再输入dhclient enp8s0f0u1u1,进行自动分配ip即可进行上网。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值