1、stream

测试四项

  • ​COPY​​:纯内存复制(a[i] = b[i]),涉及两次访存(读+写)。
  • ​SCALE​​:内存复制+标量乘法(a[i] = q * b[i]),涉及两次访存和一次浮点乘法。
  • ​ADD​​:内存加法(a[i] = b[i] + c[i]),涉及三次访存和一次浮点加法。
  • ​TRIAD​​:混合运算(a[i] = b[i] + q * c[i]),涉及三次访存和两次浮点运算(加法+乘法)。

a、b、c均为在main函数外定义的double数组,因此

1、测试粒度通常为8B

2、使用的是BSS段内存

stream的多线程使用openmp实现,在运行前通过OMP_NUM_THREADS环境变量设置线程数

因此其多线程使用同一个数组,只不过分别负责数组的不同部分,这种方法的一个缺点是可能会引入跨numa的问题,无法测出内存带宽的上限,因此stream内通过如下的First-Touch逻辑避免跨numa访问:

#pragma omp parallel for

for (j=0; j<STREAM_ARRAY_SIZE; j++) {

a[j] = 1.0;

b[j] = 2.0;

c[j] = 0.0;

}

2、lmbench

-P 参数指定多进程

各进程内分别通过malloc等方法申请堆内存,因此

1、不具有跨numa访问的问题

2、-P越大,占用的总内存量越大

bw_mem中有(不限于)

  • ​bcopy​​:memcpy
  • ​fcp​​:纯内存复制(a[i] = b[i]),类型为int数组,因此测试粒度为4B。

3、mbw

单进程单线程的内存带宽测试

包含三项,均为纯内存复制,只不过方式不同

使用calloc申请堆内存

  • ​MEMCPY​​:memcpy函数
  • DUMB​​:遍历long数组进行a[i] = b[i]
  • ​MCBLOCK​​:对内存分块的调用memcpy

数组类型为long

4、对比总结

1、mbw的memcpy 类似于 lmbench的bcopy
2、mbw的dumb 类似于 stream的copy 类似于 lmbench的fcp(粒度不同)

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐