背景:
需要在飞腾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测试子项
测试项目 | 访存操作 | 操作次数 |
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 ,提供了很丰富的指令,对于同步共享变量、合理分配负载等任务,都提供了有效的支持。测试内存带宽的时候采用多个线程并行测试,这个选项能够有效的提高内存的带宽。 | 多线程编译时使用 |
-DNTIMES | stream 测试值会随着计算机各种状态有一定波动,对波动要求较严格时可适当增大-DNTIMES 的值,测试结果取多次测试的最优值。 | 执行的次数,并从这些结果中选最优值。 |
-DSTREAM_ARRAY_SIZE= | 此值计算得到的数组大小需要超过 CPU 最大缓存的若干倍,避免数据量太小导致只测试到 cache 读写的性能。
推荐计算公式: {最高级缓存X MB}×1024×1024×4.1×CPU路数/8,结果取整数 | 按如下公式指定此值:L2 Cache (所有CPU) Byte * 1 * /8 |
-mcmodel=large | -DN=x ,-DSTREAM_ARRAY_SIZE=,数组一定大时需要指定,否则编译不过。当单个Memory Array Size 大于2GB时需要设置此参数。 | |
-O2 | GCC 的全局优化选项,启用 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即可进行上网。