内存带宽
内存带宽计算公式:带宽=内存时钟频率×内存总线位数×倍增系数/8。
STREAM测试及相关说明
STREAM测试工具是由时为美国Delaware大学教授 John McCalpin提出和完成的, 现在随着John McCalpin教授的工作变动, 负责 STREAM 的维护和改进的所有工作人员也转移到了Virginia大学的计算机科学系。
STREAM是一套综合性能测试程序集,通过fortran和C两种高级且高效的语言编写完成,由于这两种语言在数学计算方面的高效率, 使得 STREAM 测试例程可以充分发挥出内存的能力。 STREAM 测试得到的是可持续运行的内存带宽最大值,而并不是一般的硬件厂商提供的理论最大值。
STREAM 是目前业界广为流行的综合性内存带宽实际性能测量工具之一。随着处理器处理核心数量的增多,内存带宽对于提升整个系统性能越发重要,如果某个系统不能够足够迅速地将内存中的数据传输到处理器当中,若干处理核心就会处于等待数据的闲置状态,而这其中所产生的闲置时间不仅会降低系统的效率还会抵消多核心和高主频所带来的性能提升因素。 STREAM 具有良好的空间局部性,是对 TLB 友好、Cache友好的一款测试工具。
STREAM支持Copy 、Scale 、 Add、 Triad四种操作,下面分别介绍四种操作的含义:
- Copy操作最为简单,它先访问一个内存单元读出其中的值,再将值写入到另一个内存单元。
- Scale操作先从内存单元读出其中的值,作一个乘法运算,再将结果写入到另一个内存单元。
- Add操作先从内存单元读出两个值,做加法运算, 再将结果写入到另一个内存单元。
- Triad的中文含义是将三个组合起来,在本测试中表示的意思是将Copy、Scale、Add三种操作组合起来进行测试。具体操作方式是:先从内存单元中读两个值a、b,对其进行乘加混合运算(a + 因子 * b ) ,将运算结果写入到另一个内存单元。
测试结果一般的规律是Add > Triad > Copy > Scale。一次Add操作需要访问三次内存(两个读操作,一个写操作),Triad操作也需要三次访问内存, Copy和Scale操作需要两次访问内存。单位操作内,访问内存次数越多,越能够掩盖访问内存延迟,带宽越大。
测试准备工作
1、下载地址: http://www.cs.virginia.edu/stream/FTP/Code/
或者采用此压缩包 stream-5.10.tar.gz
2、配置BIOS:
- 超线程开启 System BIOS Settings--> Processor Setting--> Logical Processor: Enabled
- 系统设置高性能模式: System BIOS Settings --> System Profile --> System Profile: Performance
- 开启NUMA: System BIOS Settings -->Memory Settings-->Node Interleaving: Disabled
3、配置本地yum源后安装相应编译包
yum -y install gcc gcc-c autoconf gcc-c++ time
4、将附件压缩包stream-5.10.tar.gz解压缩
tar -zxvf stream-5.10.tar.gz
cd stream-5.10
5、编译stream.c
gcc -mtune=native -march=native -O3 -mcmodel=medium -fopenmp -DSTREAM_ARRAY_SIZE=100000000 -DNTIMES=10 stream.c -o stream.o
6、执行stream.o
#./stream.o 返回测试结果如下(越大越好):
测试说明
编译参数说明:
-mtune=native -march=native
针对CPU指令的优化,由于测试编译机即运行机器,故采用native的优化方法
-O3
编译器编译优化级别
-mcmodel=medium
当单个Memory Array Size 大于2GB时需要设置此参数
-fopenmp
适应多处理器环境;开启后,程序默认线程为CPU线程数,也可以运行时也可以动态指定运行的进程数 :export OMP_NUM_THREADS=12 #12为自定义的要使用的处理器数
-DSTREAM_ARRAY_SIZE
计算方法参考stream.c中的说明 例如本环境中查询cpu资料 L3缓存 35MB其值为 35MB*4*2*1000*1000/8 = 35millions (此值为最小值,可以适当大于此值,增大array size会增加测试时间,也会保证经历20个 clock ticks)注意 double 64bit= 8byte。这个参数是对测试结果影响最大,也是最需要关注的一个参数,指定计算中a[],b[],c[]数组的大小。
-DNTIMES=10
执行10次,并从所有结果中取最优
从结果可以看出,多核测试的结果明显高于单核测试的结果。多核测试利用了多个处理核心并行执行任务,从而表现出更大的数据带宽。在多核测试中,Copy操作的性能是单核测试的大约5倍,Scale操作的性能约为单核测试的6倍。
综上所述,多核测试在Copy和Scale操作中显示出了明显的性能优势,而在Add和Triad操作中的性能提升较小。这与多核处理器的并行处理能力和数据依赖性有关。多核测试结果显示出了多核处理器在并行计算和数据处理方面的优势。