测试子项
测试项目 | 访存操作 | 操作次数 |
---|---|---|
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 |
源码
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为自定义的要使用的处理器数 | 多线程编译时使用 |
-DNTIMES | stream 测试值会随着计算机各种状态有一定波动,对波动要求较严格时可适当增大-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时需要设置此参数。 | |
-O3 | GCC 的全局优化选项,启用 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的整体内存带宽不是倍数关系。