Stream介绍
- Stream是什么?Stream为什么重要?
Stream测试是一个简单的综合基准测试程序,它测量可持续的内存带宽(MB/s)。Stream通过fortran和c两种高级且高效的语言编写完成,由于这两种语言在数学计算方面的高效率, 使得stream测试例程可以充分发挥出内存的能力。Stream对于CPU的计算能力要求很小,对CPU内存带宽压力很大。
- Stream使用介绍
(1)测试内容介绍:
Stream测试得到的是可持续性运行的内存带宽最大值,主要是使用四种数组运算,数组的复制(Copy)、数组的尺度变换(Scale)、数组的矢量求和(ADD)、数组的复合适量求和(Triad)测试内存带宽性能。数组的值采用双精度。

1. Copy 是复制操作
从内存单元中读取一个数,并复制到其他内存单元中。
两次访问内存操作,1R1W。

2.Scale是乘法操作
从内存单元中读取一个数,与常数相乘,得到的记过存到其他内存单元。
两次访问内存操作,1R1W。

3.Add是加法操作
从两个内存单元中分别读取两个数,将其进行加法操作后,得到的结果写入另一个内存单元中。
3次访问内存操作,2R1W。

4.Triad是加法、乘法和复制三种操作的结合
从内存中读取一个数,与一个常数相乘得到一个乘积,然后从另一个内存单元中读取一个数与刚才乘积结果相加,得到的结果写入内存。
3次访问内存操作,2R1W。
测试的一般规律是Add>Triad>Copy>Scale。因为一次Add和Triad操作都需要三次访问内存,Copy和Scale操作需要进行两次访问内存,访问内存次数越多越能够掩盖访存延迟,带宽越大。
注意:测试时数组大小要大于最大Cache的四倍
(2)编译参数介绍:
-O3:编译器编译优化级别。
-fopenmp:适应多处理器环境;开启后,程序默认线程为CPU线程数。
-DSTREAM_ARRAY_SIZE:指定计算中a[],b[],c[]数组的大小。
-DNTIMES:指定执行的次数,并且从这些结果中选最优值。
-mcmodel=medium:当单个Memory Array Size 大于2GB时需要设置此参数
-mtune=native -march=native通过确定编译机的处理器类型,来选择编译时要调优的CPU。-march=native使用将在选定指令集的约束下生成适合本地机器的优化代码。-mtune=native使用将启用本地机器支持的所有指令子集。
(3)stream源码下载网址:git clone https://github.com/jeffhammond/STREAM
3.Stream测试
- 实验平台
处理器:SG2042
L3 Cache: 64MB System Cache
DDR4:32GB 2Rx8 PC4-3200P 4slot
OS:Ubuntu
Kernel:Linux 22.1
GCC: 11.1.0
- 编译
gcc -O3 -fopenmp -DSTREAM_ARRAY_SIZE=35000000 -DNTIMES=50 stream.c -o stream_o3_64
./ stream_o3_64
执行结果如下:

理论带宽为 200MHz*16bit*64bit*4/8=102.4GB/S
测试的最大带宽为 46.3GB/S 约为理论带宽的45%
改变编译器优化级别

由上图可以看出64线程中使用gcc -o0编译比gcc -o3编译时性能低,原因是使用gcc -o0编译时write操作要经过cache,因此o0优化的Copy和Scale速度比o3优化的Copy和Scale速度慢大约1/3,o0优化的Add和Triad比o3优化的Add和Triad速度慢大约1/4。
改变数组大小,每次增加500万个数组元素


改变线程数

本文介绍了Stream测试程序,用于衡量内存带宽性能。Stream通过Fortran和C语言实现,包含Copy、Scale、Add和Triad四种运算。测试时数组大小需超过最大Cache的四倍。文章还探讨了编译参数如-O3、-fopenmp等的影响,并展示了实验平台的测试结果,发现优化级别和数组大小对性能有显著影响。
4679

被折叠的 条评论
为什么被折叠?



