14

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

你预计这会在什么时候发生?你有没有在现实生活中发生过这种情况?

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

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

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

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

4

4 回答 4

9

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

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

  1. 测量一系列问题大小的执行时间。
  2. 手动计算对于相同的问题大小范围,您的程序从内存读取和写入内存的数据量。
  3. 按时间划分内存使用。

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

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

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

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

于 2010-06-02T05:51:42.953 回答
8

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

  1. 处理器外的 RAM 速度
  2. 处理器内部缓存的速度
  3. 共享内存总线的实体数量
  4. 虚拟内存

不幸的是,这些限制并不是程序性能的主要因素。更大的影响是: CPU 的数量、I/O 操作和与您的程序一起运行的其他任务。更改这些项目将影响您的程序,而不是更改影响内存带宽的项目。

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

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

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

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

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

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

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


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

于 2010-06-01T20:03:51.013 回答
3

您的问题广泛而笼统,几乎不可能在最广泛的意义上回答。

当处理一个缓存行数据所需的 CPU 周期数少于读取一个缓存行所需的 CPU 周期数并且处理的数据集远大于 CPU 的数据缓存时,您可以预期程序受 CPU 限制. 图像处理就是一个经常出现这种情况的例子。

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

于 2010-06-01T19:03:18.713 回答
1

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

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

于 2011-04-19T22:46:52.190 回答