一:STREAM的起源
STREAM测试工具是由时为美国Delaware大学教授 John McCalpin提出和完成的, 现在随着John McCalpin教授的工作变动, 负责 STREAM 的维护和改进的所有工作人员也转移到了Virginia大学的计算机科学系。
二:STREAM的用途
STREAM是一套综合性能测试程序集,通过fortran和C两种高级且高效的语言编写完成,由于这两种语言在数学计算方面的高效率, 使得 STREAM 测试例程可以充分发挥出内存的能力。 STREAM 测试得到的是可持续运行的内存带宽最大值,而并不是一般的硬件厂商提供的理论最大值。
三:软件环境准备
采用最新的内核版本的linux,测试时系统启动到单用户模式,可以通过编辑/etc/inittab文件,把其中的
id:5:initdefault
编辑为
id:3:initdefault
将一些没有必要的系统守护进程去掉,可以运行ntsysv命令,关闭除了irqbalance和messagebus.之外的系统服务进程,也可以节省系统的资源。
四:STREAM的使用方法
1、下载STREAM源程序 stream.tar (http://www.nersc.gov/users/computational-systems/cori/nersc-8-procurement/trinity-nersc-8-rfp/nersc-8-trinity-benchmarks/stream/)
2、解压stream.tar, 进入目录stream;
3、打开Makefile文件(如下图),根据平台修改编译器,以及打开需要的编译选项,例如:使用多线程打开#CFLAGS += -fopenmp编译选项,等。
编译 make ;
4、执行 (结果如下图)
./stream_c.exe
5、执行结果说明
以上测试是默认的单线程测试结果。
主要有四种数组的运算,测试到内存带宽的性能,分别是:
数组的复制(Copy)、数组的尺度变换(Scale)、数组的矢量求和(Add)、数组的复合矢量求和(Triad)。
数组的大小:Array size = 20000000
五:数据维度N定义
其中STREAM ARRAY_SIZE对测试结果影响较大。修改数组的大小,迭代的次数、数组的偏移等在源文件中。其中,数组的偏移最好对齐(如下图)。
其中N指定计算中a[],b[],c[]三个数组的大小,且数组的值采用了双精度(8个字节)。数组的维数 N定义时需要注意以下几点:
一、要充分考虑内存容量的需求,粗略估计是 N× 8(双精度) × 3 (三个数组)<= 0.6*M;M 是用户的可用内存。
二、要保证测试过程中,使用到的内存容量要大于处理器内的缓存,只有这样才会有内存的操作,而不仅仅是对处理器内缓存的操作。
三、为了保证测试可以持续一段时间,测试过程中内存带宽可以达到一定的最大值, 从而避免得不到实际最大峰值的情况,如果四项测试中有完成时间小于20微秒的情况,就需要适当的增大测试数组的维度 N。
另外,需要注意的是:-mcmodel=medium ;当单个Memory
Array Size 大于2GB时需要在编译选项中添加此参数,否则编译出错。