STREAM Benchmark及其操作性能分析

文/raywill

STREAM 是业界广为流行的综合性内存带宽实际性能 测量 工具之一。随着处理器处理核心数量的增多,内存带宽对于提升整个系统性能越发重要,如果某个系统不能够足够迅速地将内存中的数据传输到处理器当中,若干处理核心就会处于等待数据的闲置状态,而这其中所产生的闲置时间不仅会降低系统的效率还会抵消多核心和高主频所带来的性能提升因素。 STREAM 具有良好的空间局部性,是对 TLB 友好、Cache友好的一款测试。STREAM支持Copy 、Scale 、 Add、 Triad四种操作,下面分别介绍四种操作的含义:

[cpp] view plaincopy

 
  1. void tuned_STREAM_Copy()
  2. {
  3. int j;
  4. for (j=0; j<N; j++)
  5. c[j] = a[j];
  6. }
  7. void tuned_STREAM_Scale(double scalar)
  8. {
  9. int j;
  10. for (j=0; j<N; j++)
  11. b[j] = scalar*c[j];
  12. }
  13. void tuned_STREAM_Add()
  14. {
  15. int j;
  16. for (j=0; j<N; j++)
  17. c[j] = a[j]+b[j];
  18. }
  19. void tuned_STREAM_Triad(double scalar)
  20. {
  21. int j;
  22. for (j=0; j<N; j++)
  23. a[j] = b[j]+scalar*c[j];
  24. }

Copy操作最为简单,它先访问一个内存单元读出其中的值,再将值写入到另一个内存单元。 Scale操作先从内存单元读出其中的值,作一个乘法运算,再将结果写入到另一个内存单元。 Add操作先从内存单元读出两个值,做加法运算, 再将结果写入到另一个内存单元。 Triad的中文含义是将三个组合起来,在本测试中表示的意思是将Copy、Scale、Add三种操作组合起来进行测试。具体操作方式是:先从内存单元中中读两个值a、b,对其进行乘加混合运算(a + 因子 * b ) ,将运算结果写入到另一个内存单元。
下面展示用大页面和不用大页面测试STREAM的一组结果,然后再对结果进行简单分析。 测试平台:龙芯3A,主频UNKNOWN,大页面大小16M 测试结果:

首先看小页面模式(i.e. 普通的4K页面大小模式),Add > Copy > Triad > Scale,这是为什么?一次Add操作需要访问三次内存(两个读操作,一个写操作),Triad操作也需要三次访问内存,Copy和Scale操作需要两次访问内存。单位操作内,访问内存次数越多,越能够掩盖访存延迟,带宽越大。单位操作内,操作越复杂,操作完成时间越长,导致整个操作循环完成的时间越长。Add操作简单且访存次数多,故而带宽最大,Scale操作复杂且访存次数少,故而带宽最小。Copy操作简单但访存次数少,Triad操作复杂但访存次数多,考虑到编译器循环展开的作用,Copy操作能够更快地执行,最终导致Copy带宽比Triad略大。 大页面模式下,基本规律一致。由于使用了大页面,每访问16M页面才会出现一次物理缺页,相比每访问4K页面就出现一次缺页来说,访存缺页的概率大大降低。这里需要注意的是,TLB缺失开销在本实验中是无法观测到的。这是因为,本测试中,缺页开销占主导地位,访问过的内存不会被重新访问(时间局部性几乎没有),TLB缺失开销几乎可以不计。
STREAM Benchmark下载地址:http://www.cs.virginia.edu/stream/FTP/Code/

延伸内容: 以上分析基于STREAM1.0,现在已经推出了STREAM2.0测试,总体思想一致,四种操作进行了少许修改:
STREAM2 is an attempt to extend the functionality of the STREAM benchmark in two important ways:

  • STREAM2 measures sustained bandwidth at all levels of the cache hierarchy, and
  • STREAM2 more clearly exposes the performance differences between reads and writes

STREAM2 is based on the same ideas as STREAM, but uses a different set of vector kernels:

  • FILL:        similar to bzero(), but fills with a constant instead of zero
  • COPY:        similar to bcopy(), and the same as STREAM Copy
  • DAXPY:    similar to STREAM Triad, but overwrites one of the input vectors instead of writing results to a third vector
  • SUM:        sum reduction on a single vector -- reads only, no writes

Table 1: Characteristics of the STREAM2 kernels.  The value in parentheses in the "Bytes/iter read" column indicates the number of additional bytes read per iteration on machines with a "write allocate" cache policy.

STREAM2.0 下载地址: http://www.cs.virginia.edu/stream/stream2/

STREAM Benchmark的更多相关文章

  1. stream benchmark 介绍

    英文原版 https://www.cs.virginia.edu/stream/ref.html FAQ中有关于STREAM_ARRAY_SIZE NTIME OFFSET STREAM_TYPE的设 ...

  2. STREAM Benchmark及其操作性能分析

    STREAM 是业界广为流行的综合性内存带宽实际性能 测量 工具之一.随着处理器处理核心数量的增多,内存带宽对于提升整个系统性能越发重要,如果某个系统不能够足够迅速地将内存中的数据传输到处理器当中,若 ...

  3. 性能工具 stream 最新版本5.10 The STREAM benchmark

    官网下载最新性能工具 stream 最新版本5.10 https://github.com/jeffhammond/STREAM 官网下载最新性能工具 stream 最新版本5.10   http:/ ...

  4. stream benchmark 交叉编译 on psoc

    之前有研究过这个,居然忘记了,看来确实是老了,没有盘过来. 如何下载,见 linux下载网页上的文件夹以及删除文件(stream) 出现了好几个问题 1. error while loading sh ...

  5. Stream使用教程

    现在,计算机CPU运行速度的快速发展已经远远超过了内存的访问速度.越来越多的程序性能被内存带宽所限制,而不是计算机的CPU运行速率. Stream benchmark是一个简单的合成基准测试程序,衡量 ...

  6. Buildroot lmbench使用方法

    /********************************************************************** * Buildroot lmbench使用方法 * 说明 ...

  7. [基准测试]----lmbench

    引言 要评价一个系统的性能,通常有不同的指标,相应的会有不同的测试方法和测试工具,一般来说为了确保测试结果的公平和权威性,会选用比较成熟的商业测试软件.但在特定情形下,只是想要简单比较不同系统或比较一 ...

  8. Intel processor brand names-Xeon,Core,Pentium,Celeron----Xeon

    http://en.wikipedia.org/wiki/Comparison_of_Intel_processors Processor Series Nomenclature Code Name ...

  9. Java8 Stream代码详解+BenchMark测试

    Java8 Stream基础.深入.测试 1.基本介绍 1.创建方式 1.Array的Stream创建 1.直接创建 // main Stream stream = Stream.of("a ...

随机推荐

  1. lower power设计中的DVFS设计

    Pswitch = Ceff * Vvdd^2*Fclk, Pshort-circuit = Isc * Vdd * Fclk, Pleakage = f(Vdd, Vth, W/L) 尽管对电压的s ...

  2. ajax中网页传输(二)JSON——下拉列表显示练习

    以json返回数据类型显示“民族下拉列表” 第一:body页面显示部分 <title>JSON下拉显示Nation表中的数据</title> <script src=&q ...

  3. Azure Deploy

    http://msdn.microsoft.com/en-us/library/dn408531.aspx https://www.windowsazure.com/en-us/documentati ...

  4. android小功能:checkbox使用自己的背景点击切换背景

    xiazai_checkbox.xml <?xml version="1.0" encoding="utf-8"?> <selector xm ...

  5. [转]Delphi多线程编程入门(二)——通过调用API实现多线程

    以下是一篇很值得看的关于Delphi多线程编程的文章,内容很全面,建议收藏. 一.入门 ㈠. function CreateThread(    lpThreadAttributes: Pointer ...

  6. 不允许调用库函数,也不允许使用任何全局或局部变量编写strlen函数

    不允许调用库函数,也不允许使用任何全局或局部变量编写strlen函数. 这是一道面试题,可以使用递归的方式解答,答案如下: #include <stdio.h> int mylen(cha ...

  7. 使用 TFDConnection 的 pooled 连接池

    从开始看到这个属性,就一直认为他可以提供一个连接池管理功能, 苦于文档资料太少, 甚至在帮助中对该属性的使用都没有任何介绍,如果你搜索百度,也会发现基本没资料. 最后终于在其官方网站看到了其完整相关的 ...

  8. jQuery DataTable-JavaScript API

    虽然大多数时候你的Javascript交互将通过使用datatable初始化对象作为描述在使用这个网站的部分,有时,你会发现它有用一些外部控制表.可以使用以下函数从jQuery.dataTable对象 ...

  9. ubuntu下配置tomcat

    配置tomcat 1.解压 tar -zxvf apache-tomcat-7.0.53.tar.gz 2.修改/bin/catalina.sh cygwin=falsedarwin=falseos4 ...

  10. Docker第三方项目小结

    软件项目的成功常常根据其催生的生态系统来衡量.围绕或基于核心技术构建的项目增添了功能和易用性,它们常常日臻完善.Docker就是一个典例,有众多第三方项目扩展.补充或改进Docker. •Docker ...