我想知道我正在使用的程序以及需要大量内存的程序是否受内存带宽的限制.
你什么时候期待这种情况发生?它是否曾在现实生活中发生过?
我找到了几篇讨论这个问题的文章,包括:
http://www.cs.virginia.edu/~mccalpin/papers/bandwidth/node12.html
http://www.cs.virginia.edu/~mccalpin/papers/bandwidth/node13.html
http://ispass.org/ucas5/session2_3_ibm.pdf
第一个链接有点旧,但建议你需要为每个浮点变量执行少于约1-40个浮点运算才能看到这个效果(如果我错了,请纠正我).
如何测量给定程序使用的内存带宽以及如何测量系统可提供的(峰值)带宽?
我不想在这里讨论任何复杂的缓存问题.我只对CPU和内存之间的通信感兴趣.
要测试系统的内存性能,请尝试使用STREAM基准测试.研究基准测试任务和您仔细研究的结果,因为它们提供了有关您的记忆的基本数据,您需要做进一步的操作.您需要弄清楚缓存的效果 - 您必须了解它们 - 以及带宽何时达到峰值.
要弄清楚程序的内存性能:
测量一系列问题大小的执行时间.
手动计算程序从相同范围的问题大小读取和写入内存的数据量.
按时间划分内存使用.
警告:这是一种粗略的方法,只应用于确定是否应该注意内存带宽问题.如果您的粗略计算告诉您,您的程序使用的可用内存带宽少于50%(您从STREAM基准测试获得的数据),那么您不应该再考虑它了.
当您的程序使用简单的访问模式操作相对较少的非常大的数据结构时,这种原始方法最有效.这确实描述了许多高性能的科学计划,但也许不是很多其他类型的计划.
如果你的程序正在使用虚拟内存,或者它正在执行I/O,那么内存带宽不是问题,直到你整理掉磁盘带宽.
最后,是的,每次运行我们的一个科学代码时,执行速度都会受到内存带宽的限制.根据经验,如果代码执行处理器规范承诺的FLOPS的10%,我很高兴.
内存密集型应用程序或需要大量内存的应用程序受以下因素限制:
处理器外部的RAM速度
处理器内的缓存速度
共享内存总线的实体数量
虚拟内存
不幸的是,这些限制并不是计划表现的主要参与者.更大的影响包括: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操作,并发任务和重新设计软件,而不是通过更改内存访问速度的上限,可以获得更高的性能.更改这些限制将提高程序的性能,但不会像其他技术那样激烈.