以centos7为例


简介:stream由Virginia University提供,通过生成四种不同模式下的内存读写操作,用于测试高性能计算机的内存带宽。 现代计算机中都是用缓存技术,为了保证测试正确反映计算机内存的读写性能,测试中使用的数据量应远大于缓存大小。

Copy为最简单的操作,即从一个内存单元中读取一个数,并复制到另一个内存单元,有2次访存操作。
Scale是乘法操作,从一个内存单元中读取一个数,与常数scale相乘,得到的结果写入另一个内存单元,有2次访存。
Add是加法操作,从两个内存单元中分别读取两个数,将其进行加法操作,得到的结果写入另一个内存单元中,有2次读和1次写共3次访存。
Triad是前面三种的结合,先从内存中读取一个数,与scale相乘得到一个乘积,然后从另一个内存单元中读取一个数与之前的乘积相加,得到的结果再写入内存。所以,有2次读和1次写共3次访存操作。

测试结果一般的规律是Add > Triad > Copy > Scale。一次Add操作需要访问三次内存(两个读操作,一个写操作),Triad操作也需要三次访问内存, Copy和Scale操作需要两次访问内存。单位操作内,访问内存次数越多,越能够掩盖访存延迟,带宽越大。


1.下载并解压stream
直接使用下面的wget下载命令即可

# wget https://asc.llnl.gov/computing_resources/purple/archive/benchmarks/memory/stream.tar

# tar -xvf stream.tar

如果上面链接失效可以直接从下面链接下载
链接:https://pan.baidu.com/s/15ds1TrGKCvG6YMGqjmlY4Q
提取码:kryj

2.编译
单线程编译:

# gcc -mtune=native -march=native -O3 -mcmodel=medium -DSTREAM_ARRAY_SIZE=200000000 -DNTIMES=30 stream.c -o stream.o

多线程编译(一般采用多线程编译):

# gcc -mtune=native -march=native -O3 -mcmodel=medium  -fopenmp -DSTREAM_ARRAY_SIZE=8000000 -DNTIMES=30 stream.c -o stream.o

上述多线程编译参数含义如下
-mtune=native -march=native:针对CPU指令的优化,此处由于编译机即运行机器。故采用native的优化方法。使用-mtune =native将在所选指令集的约束下生成针对本地计算机优化的代码。使用-march =native将启用本地计算机支持的所有指令子集(因此结果可能无法在其他计算机上运行)

-O3:编译器编译优化级别

-mcmodel=medium:当单个Memory Array Size 大于2GB时需要设置此参数(小于2GB时也可保留这个参数,此时这个参数不生效)

-fopenmp:适应多处理器环境;开启后,程序默认线程为CPU线程数

-DSTREAM_ARRAY_SIZE=8000000:这个参数是对测试结果影响最大,也是最需要关注的一个参数,它用来指定计算中a[],b[],c[]数组的大小,它的值不能太大,也不能太小,太大的话,会延长测试时长并影响测试准确性甚至执行测试失败,太小的话,CPU Cache会干扰测试结果,不能测试出真实的内存带宽。要确定合适的size值,首先要使用cat /sys/devices/system/cpu/cpu0/cache/index3/size命令查看测试机的三级缓存,假如测试机配置为4C8G,cpu拓扑为socket=1,core=2,thread=2,查到的三级缓存为16384K也就是16MB,那么size应该设置为(1socket * 16MB/socket * 1000 * 1000) * 4 / 8B = 8000000,乘以4是因为官方建议size是三级缓存的四倍,除以8是因为STREAM_ARRAY_SIZE为double类型,每个double类型占用8Byte。

-DNTIMES=30:执行的次数,并且从这些结果中选最优值

3.编译后执行测试

# ./stream.o
注:如果重复进行测试,则再次测试前需执行以下命令,用以删除所有类型的IPC对象,包括共享内存段、消息队列和信号量,它会移除系统中的所有IPC对象,并释放相应资源
# ipcrm --all

测试结果如下图

centos stream没有yum怎么办_内存带宽