欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【开发工具】【stream】内存带宽测试工具(Stream)的使用

程序员文章站 2022-07-12 18:58:44
...

获取更多相关的嵌入式开发工具,可收藏系列博文,持续更新中:
【开发工具】嵌入式常用开发工具汇总帖


Stream简介

STREAM是一套综合性能测试程序集,通过fortran和C两种高级且高效的语言编写完成,由于这两种语言在数学计算方面的高效率, 使得 STREAM 测试例程可以充分发挥出内存的能力。 STREAM 测试得到的是可持续运行的内存带宽最大值,而并不是一般的硬件厂商提供的理论最大值。

Stream测试原理:

1.主要有四种数组的运算,测试到内存带宽的性能,分别是:数组的复制(Copy)、数组的尺度变换(Scale)、数组的矢量求和(Add)、数组的复合矢量求和(Triad)

2. 数组的值采用了双精度(8个字节)


Stream工具安装

tar -zxvf stream_5.10.tar.gz

注:小技巧:Linux下一般压缩文件后缀为.tar.bz2和.tar.gz,
它们解压命令有两三个选项是一致的:
xf(v),前者再加上j选项,后者再加上z选项。
  • 进入目录
cd stream_5.10
  • 编译
gcc -O3 -mcmodel=small  -mtune=native -march=native -fopenmp -DSTREAM_ARRAY_SIZE=200000000 -DNTIMES=30 stream.c -o stream.o

参数解析:
-O3 ; 编译器编译优化级别;
-mcmodel=small ;当单个Memory Array Size 大于2GB时需要设置此参数。
    //新的gcc已经不支持‘-mcmodel=medium’参数了,可以改为“-mcmodel=large”、“-mcmodel=small”、“-mcmodel=tiny”
-fopenmp; 适应多处理器环境;开启后,程序默认线程为CPU线程数,
           也可以运行时也可以动态指定运行的进程数 :
           export OMP_NUM_THREADS=12   #12为自定义的要使用的处理器
-DSTREAM_ARRAY_SIZE=200000000;指定计算中a[],b[],c[]数组的大小,
    //这个参数是对测试结果影响最大,也是最需要关注的一个参数,它用来指定计算中a[],b[],c[]数组的大小,
    //它的值不能太大,也不能太小,太大的话,会影响测试准确性,太小的话,CPU Cache会干扰测试结果,不能测试出真实的内存带宽。
    //要确定合适的size值,首先要使用cat /sys/devices/system/cpu/cpu0/cache/index3/size命令查看测试机的三级缓存,
    //假如测试机配置为8C32G,查到的三级缓存为16384K(也就是16MB),那么size最小应该设置为(8C*16MB/core)/8B=32M=32000000,官方建议为size的四倍,即128M=128000000
-DNTIMES=30 ;执行的次数,并且从这些结果中选最优值。
-DOFFSET=4096 ;数组的偏移,一般可以不定义。
  • 运行
./stream.o 

Ps:

编译可能出现的报错

gcc: error: unrecognized argument in option ‘-mcmodel=medium’

gcc: note: valid arguments to ‘-mcmodel=’ are: large small tiny

原因:

新的gcc已经不支持‘-mcmodel=medium’参数了,可以改为“-mcmodel=large”、“-mcmodel=small”、“-mcmodel=tiny”


Stream工具的使用

编译后执行测试

[email protected]:~/stream_5.10# ./stream.o 
-------------------------------------------------------------
STREAM version $Revision: 5.10 $
-------------------------------------------------------------
This system uses 8 bytes per array element.
-------------------------------------------------------------
Array size = 200000000 (elements), Offset = 0 (elements)
Memory per array = 1525.9 MiB (= 1.5 GiB).
Total memory required = 4577.6 MiB (= 4.5 GiB).
Each kernel will be executed 30 times.
 The *best* time for each kernel (excluding the first iteration)
 will be used to compute the reported bandwidth.
-------------------------------------------------------------
Number of Threads requested = 64
Number of Threads counted = 64
-------------------------------------------------------------
Your clock granularity/precision appears to be 1 microseconds.
Each test below will take on the order of 283742 microseconds.
   (= 283742 clock ticks)
Increase the size of the arrays if this shows that
you are not getting at least 20 clock ticks per test.
-------------------------------------------------------------
WARNING -- The above is only a rough guideline.
For best results, please be sure you know the
precision of your system timer.
-------------------------------------------------------------
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:           10011.9     0.341517     0.319619     0.410092
Scale:          12862.1     0.263717     0.248792     0.308815
Add:            12651.1     0.399726     0.379415     0.448929
Triad:          12634.4     0.401277     0.379914     0.441468
-------------------------------------------------------------
Solution Validates: avg error less than 1.000000e-13 on all three arrays
-------------------------------------------------------------