1、下载安装Stream
tar -xvf stream.tar
参数说明:
首先看下源码中对于编译stream.c的参数介绍:
#ifdef _OPENMP 定义开启多处理器运行环境,
extern int omp_get_num_threads();
#endif
#ifndef STREAM_ARRAY_SIZE 定义计算的数组大小(成员个数)
# define STREAM_ARRAY_SIZE 45000000
#endif
#ifdef NTIMES 定义值非法时,若定义计算次数,10
#if NTIMES<=1
# define NTIMES 10
#endif
#endif
#ifndef NTIMES 若定义计算次数,10
# define NTIMES 10
#endif
#ifndef OFFSET 定义数组偏移量
# define OFFSET 0
#endif
#ifndef STREAM_TYPE 定义数组为双精度,64bit,8Bytes
#define STREAM_TYPE double
#endif
以上参数可以在执行前编译指定具体值
1. -mtune=native -march=native \\针对CPU指令的优化,由于测试编译机即运行机器,故采用native的优化方法
2. -O3 \\优化级别
3. -mcmodel=medium \\当单个Memory Array Size 大于2GB时需要设置此参数
4. -fopenmp \\适应多处理器环境;开启后,程序默认线程为CPU线程数,也可以运行时也可以动态指定运行的进程数 。例如:export OMP_NUM_THREADS=12 #12为自定义的要使用的处理器数
5. -DSTREAM_ARRAY_SIZE \\计算方法参考stream.c中的说明 例如本环境中查询cpu资料 L3缓存 8MB 其值为 8MB*4*2*1000*1000/8 = 8millions (此值为最小值,可以适当大于此值,增大array size会增加测试时间)注意 double 64bit= 8byte
6. -DNTIMES \\执行次数,并从所有结果中取最优
7. -DOFFSET=4096 \\数组的偏移,一般可以不设置
2、使用stream测试内存带宽
单线程编译:
gcc -O -mtune=native -march=native -mcmodel=large -DSTREAM_ARRAY_SIZE=100000000 -DNTIME=30 -DOFFSET=4096 stream.c -o stream.o
单线程测试:./stream.o
多线程编译:
gcc -O -mtune=native -march=native -mcmodel=large -fopenmp -DSTREAM_ARRAY_SIZE=100000000 -DNTIMES=30 -DOFFSET=4096 stream.c -o stream.o
多线程测试:./stream.o
3、测试内存延迟
下载安装英特尔MLC工具:
(在新型的Intel处理器上精确测试内存延迟是非常困难的,因为它有复杂的硬件预取器。Intel MLC在测试延迟时会自动禁用这些预取器,并且在测试完成后自动恢复预取器原状态。预取器控制是通过修改MSR实现(Disclosure of H/W prefetcher control on some Intel processors),在Linux上需要root权限。Windows平台,提供了签名的驱动用于访问MSR)
下载地址:
https://software.intel.com/content/www/us/en/develop/articles/intelr-memory-latency-checker.html
tar -zxvf mlc_xxx.tgz -C mlc
进入mlc / Linux目录下测试
命令行参数:
mlc --latency_matrix
打印本地和跨插槽内存延迟矩阵
mlc --idle_latency
打印平台的空闲内存延迟
mlc --loaded_latency
打印平台的加载内存延迟
mlc --c2c_latency
打印平台的缓存到缓存传输延迟
mlc -e
不要修改预取器设置
参考:
https://software.intel.com/content/www/us/en/develop/articles/intelr-memory-latency-checker.html