【性能测试】stream内存带宽性能测试工具

测试子项

测试项目访存操作操作次数
Copyc[i] = a[i]1R1W
Scaleb[i] = scalar * c[i]1R1W
Addc[i] = a[i] + b[i]2R1W
Triada[i] = b[i] + scalar * c[i]2R1W

源码

steam 官网源码,目前更新到 5.10 版本。

硬件配置

内存,1DPC,one DIMM per Channel,每个内存通道安装 1 根相同厂家型号的 DIMM ,且主频为支持的最大主频。

软件配置

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

编译安装

ICC

#单线程编译
icc -O3 -mtune=native -mavx512f -mcmodel=large -w -diag-disable=10441 -DNTIMES=20 -DSTREAM_ARRAY_SIZE=110000000 stream.c -o stream_icc_singel

#多线程编译
icc -O3 -mtune=native -mavx512f -mcmodel=large \
 -qopenmp `#多线程编译` \
 -diag-disable=10441 -DNTIMES=20 -DSTREAM_ARRAY_SIZE=110000000 stream.c \
 -o stream_icc_multi

GCC

#单线程编译
gcc -O3 -mtune=native -march=native -ftree-vectorize -DSTREAM_ARRAY_SIZE=800000000 -DNTIMES=20 -mcmodel=large stream.c -o stream_singel

#多线程编译
gcc -O3 -mtune=native -march=native -ftree-vectorize -DSTREAM_ARRAY_SIZE=800000000 -DNTIMES=20 -mcmodel=large stream.c \
    -fopenmp `#多线程编译` \
 -o stream_multi
CFLAGS选项参数解释备注
-DOFFSET=4096数组的偏移,一般可以不设置。
-fopenmp采用 gcc 自带的 OpenMP ,提供了很丰富的指令,对于同步共享变量、合理分配负载等任务,都提供了有效的支持。测试内存带宽的时候采用多个线程并行测试,这个选项能够有效的提高内存的带宽。
适应多处理器环境;开启后,程序默认线程为CPU线程数,也可以运行时动态指定运行的进程数 。例如:export OMP_NUM_THREADS=12 #12为自定义的要使用的处理器数
多线程编译时使用
-DNTIMESstream 测试值会随着计算机各种状态有一定波动,对波动要求较严格时可适当增大-DNTIMES 的值,测试结果取多次测试的最优值。
-DSTREAM_ARRAY_SIZE=此值计算得到的数组大小需要超过 CPU 最大缓存的 4 倍,避免数据量太小导致只测试到 cache 读写的性能。
比如双路服务器 2 CPU,最大缓存为 单个 CPU 的 L3 cache x2。
单位为字节 Byte,4倍 是因为官方建议 size 是三级缓存的四倍,除以 8 是因为 STREAM_ARRAY_SIZE 为 double 类型,每个 double 类型占用 8 Byte。
按如下公式指定此值:L3 Cache (所有CPU) Byte * 4.1 /8。
如 2* Intel 5250 L3 Cache = 48MB * 2 = 48 * 1024 * 1024 * 2,
则指定-DN=48 * 1024 * 1024 * 2 * 4.1 /8=51589939
-mcmodel=large-DN=x ,-DSTREAM_ARRAY_SIZE=,数组一定大时需要指定,否则编译不过。当单个Memory Array Size 大于2GB时需要设置此参数。
-O3GCC 的全局优化选项,启用 O3 级别优化。
还可以再加入参数 -ftree-vectorize 启用矢量化。
优化级别,优化级别分为00\O1\O2\O3,O0是无优化,O1是减少代码尺寸和执行时间,O2是几乎执行所有优化而不考虑代码尺寸和时间,O3是优化级别最高,可能增加代码尺寸。在stream内存带宽测试中,一般情况下建议选择O2或者O3,两者测试结果差别不大。
启用矢量化可能降低测试性能数据。
-mtune=native针对CPU指令的优化,此处由于编译机即运行机器。故采用 native 的优化方法。
使用 -mtune =native 将在所选指令集的约束下生成针对本地计算机优化的代码。
启用此项有可能降低测试性能数据。
-march=native使用 -march =native 将启用本地计算机支持的所有指令子集(因此编译的程序可能无法在其他计算机上运行)启用此项有可能降低测试性能数据。

测试

测试命令选项

基本测试命令
export OMP_NUM_THREADS=128    #为运行的线程数,建议为 CPU 核的个数
export GOMP_CPU_AFFINITY=0-127  #测试运行线程的 CPU 亲和性(绑核)
numactl --localalloc ./stream #运行测试,–localalloc 表示使用内存方式,优先使用本节点内存,不交叉,以免降低性能

测试结果

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

单个 CPU 的内存带宽:4800MHz x 8 x 64bit ÷ 8 = 307200 MB = 300 GB

双路服务器,2个CPU的整体内存带宽不是倍数关系。

调优

硬件

BIOS

OS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值