代码之家  ›  专栏  ›  技术社区  ›  hanno

什么时候程序会受到内存带宽的限制?

  •  12
  • hanno  · 技术社区  · 16 年前

    我想知道我正在使用的一个需要大量内存的程序是否受到内存带宽的限制。

    你预计什么时候会发生这种事?你在现实生活中遇到过这种事吗?

    我发现有几篇文章讨论这个问题,包括:

    第一个链接有点旧,但建议您需要对每个浮点变量执行不到1-40个浮点运算,才能看到这种效果(如果我错了,请纠正我)。

    如何测量给定程序正在使用的内存带宽,以及如何测量系统可以提供的(峰值)带宽?

    我不想在这里讨论任何复杂的缓存问题。我只对CPU和内存之间的通信感兴趣。

    4 回复  |  直到 14 年前
        1
  •  9
  •   High Performance Mark    16 年前

    要测试系统的内存性能,请尝试 STREAM benchmark . 仔细研究基准任务和你得到的结果,因为它们提供了关于你记忆的基本数据,你需要做进一步的工作。你需要弄清楚缓存的效果——你必须了解它们——以及带宽何时达到峰值。

    1. 测量一系列问题大小的执行时间。
    2. 手工计算在相同的问题大小范围内,程序从内存中读写的数据量。
    3. 将内存使用除以时间。

    警告:这是一种粗糙的方法,只能用于确定是否应该注意内存带宽问题。如果您粗略的计算告诉您,您的程序使用的可用内存带宽不到50%(您从流基准测试得到的数据),那么您不应该再考虑它。

    当您的程序使用简单的访问模式处理相对较少的非常大的数据结构时,这种粗糙的方法最有效。这确实描述了许多高性能的科学项目,但也许没有很多其他类型的项目。

    如果您的程序使用的是虚拟内存,或者在执行时执行I/O操作,那么内存带宽不是问题,除非您解决了磁盘带宽问题。

    最后,是的,每次我运行一个科学代码时,执行速度都会受到内存带宽的限制。根据经验,如果一个代码执行处理器规范承诺的10%的失败,我会很高兴。

        2
  •  8
  •   Thomas Matthews    16 年前

    1. 处理器外部RAM的速度
    2. 共享数据的实体数
    3. 虚拟内存

    1.处理器外RAM的速度
    处理器必须跳出外壳,从RAM中获取指令和数据。RAM可以以不同的速度访问单元并将位返回给处理器。通常,以Hz为单位进行标记。内存越快,进程加载指令和数据的时间越短,程序执行的速度也越快。

    将内存的速度提高到处理器的能力之外并不能提高性能。它改变了从RAM到处理器的瓶颈。另见#3。

    2.处理器内部缓存速度 高速缓存驻留在处理器的外壳中。这是可用的最快的内存类型之一。处理器将在搜索RAM之前搜索此内存。提高内存的速度和数量将提高处理器的性能, 除非其他内核也在访问这个内存

    注: 除了获得另一个处理器之外,您无法加快或更改高速缓存的大小。缓存不是人类或机器手可以轻易改变的东西。

    3.共享内存总线的实体数
    内存总线就像一条高速公路,实体使用它来到达RAM。与高速公路一样,更多的车道意味着更快的吞吐量(例如,16位宽度与32位宽度)。很多公交车也有限速,同样限速越高,上车越快。可能最值得注意的概念是连接到总线的实体数。与高速公路一样,更多的用户会减慢交通速度。在大多数内存总线中,一次只能有一个实体使用它;其他实体必须等待。减少需要使用内存总线的实体的数量将加快程序的速度。

    共享内存总线的一些常见实体:CPU、DMA控制器、视频处理器、声音处理器和网络或I/O处理器。

    4.虚拟内存。 许多现代计算机使用 虚拟内存 . 如果程序需要的内存超过RAM中的可用内存,则操作系统会将部分内存与硬盘上的区域交换。这比降低内存运行速度花费更多的性能时间。内存密集型程序只使用分配给它的内存比它可能需要的所有内存更有效。减少这些虚拟内存交换将加快程序的速度。


        3
  •  3
  •   Scott Solmer    11 年前

    你的问题范围很广,几乎不可能用最广泛的意义来回答。

    当处理一条缓存线所需的CPU周期数小于读取一条缓存线所需的CPU周期数,并且处理的数据集比CPU的数据缓存大得多时,可以预期程序是CPU绑定的。图像处理就是这样一个例子。

    只有在CPU支持某种性能计数器的情况下(在软件中)才能测量第一个计数器,这种计数器统计CPU由于必须等待内存访问完成而暂停的周期数。
    第二种方法很容易测量,通常是填充/复制大面积内存。有无数的基准程序可用,你可以使用(我没有使用这些年,但其中之一) Sandra PCMark

        4
  •  1
  •   Pari Rajaram    15 年前

    如果代码顶层例程(从平面配置文件)有更多的算术运算要加载/存储,那么您不会受到内存带宽的太多影响。例如优化矩阵乘法,LINPACK。