-Stream内存测试

Stream内存测试

hades 61天前 79

概述

stream是通过对数组的copy,scale,add,trial操作来测试CPU的内存访问带宽和浮点运算能力。

  • Copy为最简单的操作,即从一个内存单元中读取一个数,并复制到另一个内存单元,有2次访存操作。
  • Scale是乘法操作,从一个内存单元中读取一个数,与常数scale相乘,得到的结果写入另一个内存单元,有2次访存。
  • Add是加法操作,从两个内存单元中分别读取两个数,将其进行加法操作,得到的结果写入另一个内存单元中,有2次读和1次写共3次访存。
  • Triad是前面三种的结合,先从内存中读取一个数,与scale相乘得到一个乘积,然后从另一个内存单元中读取一个数与之前的乘积相加,得到的结果再写入内存,所以,有2次读和1次写共3次访存操作。
export OMP_NUM_THREADS=64(64核)
export GOMP_CPU_AFFINITY=0-63
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
gcc -O3 stream.c -DSTREAM_ARRAY_SIZE=800000000 -mcmodel=large -o stream  #单线程
gcc -O3 -fopenmp stream.c -DSTREAM_ARRAY_SIZE=256000000 -mcmodel=large -o stream-m  #多线程

 

stream测试内存带宽的原理

 

* 申请了三个巨大的数组a,b,c;分别进行如下运算

c = a; b = 3 * c; c = a + b; a = b + c * 3

* 统计每一次运算需要的时间

* 操作的数据量分别是如下:

static double bytes[4] = {
2 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE,
2 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE,
3 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE,
3 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE
};

* 最终带宽就是 bandwidth = data_size / time

 

数组大小:-DSTREAM_ARRAY_SIZE=4000000000

数组大小(个数),每个数组元素8字节

4000000000 * 8 B --->  6.0GB

默认测试10次,取最优的结果,测试通过-NTIMES控制;

 

Stream安装

工具下载

Stream为开源工具,可直接在网上下载使用,下载链接如下:

http://www.cs.virginia.edu/stream/ref.html

 

stream编译

Stream工具同speccpu工具一样,也使用gcc编译器进行编译。

  • 步骤1 上传安装包到/home路径,并解压文件。
cd /home
unzip stream.zip
  • 步骤2 编译stream。
gcc -O3 -fopenmp -o stream stream.c

-fopenmp #OpenMP提供了很丰富的指令,对于同步共享变量、合理分配负载等任务,都提供了有效的支持。测试内存带宽的时候采用多个线程并行测试,这个选项能够有效的提高内存的带宽。

-O3#使用O3编译可使性能优化

 

 

测试

OS配置

  • 设置为performance
cpupower frequency-set -g performance
  • 关闭透明大页:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
  • 编译器及库文件版本:
gcc version:8.3.0
glibc version: 2.28

 

执行测试

 

  • 步骤1 单线程测试
gcc -O -DSTREAM_ARRAY_SIZE=100000000 -mcmodel=large -DNTIME=20 stream.c -o stream.o
./stream.o
  • 步骤2 多线程测试
gcc -O -fopenmp -DSTREAM_ARRAY_SIZE=100000000 -mcmodel=large -DNTIME=20 stream.c -o stream.o
./stream.o
最新回复 (0)
返回
发新帖
0