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

时间:2010-06-01 18:30:14

标签: c linux memory-management hpc

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

您认为这会发生什么时候?它是否曾在现实生活中发生过?

我找到了几篇讨论这个问题的文章,包括:

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

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

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

4 个答案:

答案 0 :(得分:8)

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

要弄清楚程序的内存性能:

  1. 测量一系列问题规模的执行时间。
  2. 手动计算程序从相同范围的问题大小读取和写入内存的数据量。
  3. 按时间划分内存使用。
  4. 警告:这是一种粗略的方法,只应该用来确定你是否应该注意内存带宽问题。如果您的粗略计算告诉您,您的程序使用的可用内存带宽少于50%(您从STREAM基准测试获得的数据),那么您不应该再考虑它了。

    当您的程序使用简单的访问模式操作相对较少的非常大的数据结构时,这种原始方法效果最佳。这确实描述了许多高性能的科学计划,但也许并没有很多其他类型的计划。

    如果你的程序正在使用虚拟内存,或者它正在执行I / O,那么内存带宽不是问题,直到你整理磁盘带宽为止。

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

答案 1 :(得分:7)

需要大量内存的内存密集型应用程序或应用程序受以下限制:

  1. 处理器外部的RAM速度
  2. 处理器内的缓存速度
  3. 分享的实体数量 内存总线
  4. 虚拟内存
  5. 不幸的是,这些限制并不是计划表现的主要参与者。更大的影响包括:CPU数量,I / O操作以及程序运行的其他任务。更改这些项目会影响您的程序,而不是更改影响内存带宽的项目。

    <强> 1。处理器外部的RAM速度
    处理器必须超出其shell并从RAM中获取指令和数据。 RAM具有不同的速度,可以访问单元并将位返回处理器。通常,这以Hz为单位标记。内存越快,您的进程花费加载指令和数据的时间就越少,程序执行的速度就越快。

    注意:提高内存速度超出处理器的能力不会提高性能。它将瓶颈从RAM更改为处理器。另见#3。

    <强> 2。处理器内的缓存速度 高速缓存存储器驻留在处理器的shell内。这是最快的内存类型之一。处理器将在搜索RAM之前搜索此内存。提高此内存的速度和数量将提高处理器的性能,除非其他内核也访问此内存。对于访问内存的多个内核,需要解决冲突,这可能会降低应用程序性能。

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

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

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

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


    总之,应用程序可以执行的最大速度。内存,内部缓存和外部RAM都是上限的因素。有更大的因素阻止应用程序达到此限制。其中一些因素是I / O操作和其他并发任务。程序的设计和实现也可能导致缓慢。通过消除I / O操作,并发任务和重新设计软件,而不是通过更改内存访问速度的上限,可以获得更高的性能。更改这些限制将提高程序的性能,但不会像其他技术那样激烈。

答案 2 :(得分:3)

你问题的广泛和一般范围使得几乎不可能在最广泛的意义上回答。

当处理一个高速缓存行所需的CPU周期数小于读取一个高速缓存行所需的CPU周期数且处理的数据集大得多时,可以预期程序会受CPU限制。 CPU的数据缓存。图像处理就是这种情况的一个例子。

如何衡量给定程序使用的内存带宽以及如何衡量系统可提供的(峰值)带宽? 第一个只能用软件测量(如果CPU支持某种性能计数器,它计算CPU停止的周期数,因为它必须等待内存访问完成。) 第二个可以很容易地测量,通常是填充/复制大面积的内存。你可以使用无数的基准程序(我多年没有使用其中一个,但SandraPCMark会浮现在脑海中。应该有很多免费软件实用程序也可以这样做)。

答案 3 :(得分:1)

受内存带宽限制的程序对算术/逻辑运算具有更高的内存引用(加载和/或存储操作)。示例是BLAS1例程,如daxpy,ddot等。

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