我一直在阅读Von Neumann的瓶颈和AFAIK,问题在于CPU应该获取或修改数据操作,但不能同时获取或修改数据操作;因为它们都需要访问相同的内存总线。 所以,问题主要在于有限的公交换乘率。 我已经读过如何缓解这个问题,它提到并行处理应该解决它,它不仅仅依赖于1个核心,所以当核心卡在获取操作中时,其他核心工作在一个单独的方式,大大缩短了计算时间。
这是正确的理解吗?如果是这样,是不是所有这些核心共享相同的总线到内存?从一开始就成了瓶颈?
答案 0 :(得分:4)
它没有。 Von Neumann瓶颈指的是处理器和内存位于慢速总线的两侧。如果要计算某些东西,则必须将输入通过总线移动到处理器。然后,您必须在计算完成时将输出存储到内存中。您的吞吐量受内存总线速度的限制。
缓存通过将少量常用数据保留在处理器附近,有助于缓解许多工作负载的此问题。如果您的工作负载重用大量数据,那么您将从缓存中受益。但是,如果您处理的数据集太大而无法放入缓存中,或者您的算法没有良好的数据重用,则缓存可能无法带来太多好处。想想处理一个非常大的数据集。您需要加载所有数据并将其存储至少一次。如果你很幸运,你的算法只需要查看一次数据块,任何重用的值都将保留在缓存中。如果没有,你可能会在每个数据元素上多次使用内存总线。
并行处理是一个相当广泛的术语。根据您的操作方式,您可能会或可能不会获得更多带宽。
今天实施共享内存处理器的方式并不能解决冯诺依曼的瓶颈问题。如果有的话,拥有更多内核会给总线带来更多压力,因为现在更多的处理器需要从内存中获取数据。您需要更多带宽来满足所有这些需求。举个例子:许多并行算法受内存限制,他们无法利用现代多核芯片上的所有内核,特别是因为它们无法足够快地获取数据。即使从处理器到处理器的总带宽增加,核心数量也在增加,并且每个核心的带宽可能会在限制内减少。
现代内存总线变得越来越复杂,你可以做更有效地使用它们的事情。例如,在NUMA计算机上,某些内存库比某些处理器更接近某些处理器,如果您有效地布局数据,则可以获得比从RAM中的任何位置盲目获取的带宽更多的带宽。但是,扩展共享内存很困难 - 请参阅Distributed Shared Memory Machines,了解为什么它很难将共享内存计算机扩展到超过几千个内核。
分布式内存计算机是一种并行计算机。这些通常被称为集群 - 它们基本上只是在同一网络上尝试执行常见任务的一堆节点。如果每个处理器仅从其本地内存中获取,则可以在群集中获得线性带宽扩展。但是,这需要您有效地布置数据,以便每个处理器都有自己的块。人们将此称为数据并行计算。如果您的数据主要是数据并行的,那么您可以使用大量处理器,并且可以并行使用所有内存带宽。如果您无法并行化您的工作负载,或者您无法将数据分成几个块,以便每个数据块主要由一个或几个节点处理,那么您就可以了。重新回到顺序工作负载,你仍然受到单核心带宽的限制。
人们已经研究了替代节点架构来解决Von Neumann的瓶颈问题。最常被引用的可能是Processor-in-memory, or PIM。在这些体系结构中,为了解决内存总线问题,您将一些处理器嵌入内存中,有点像集群,但规模较小。每个微核通常可以对其本地数据执行一些不同的算术运算,因此您可以非常快速地执行某些操作。但是,再次,以实际使这种处理有用的方式排列数据可能很困难,但有些算法可以利用它。
总之,通用计算机中的Von Neumann瓶颈,处理器可以对来自内存中任何地址的数据执行任何操作,这是因为您必须将数据移动到处理器以计算任何内容。
简单地构建并行机器并不能解决问题,尤其是当所有内核都位于内存总线的同一侧时。如果您愿意将多个处理器和展开,以便它们比其他数据更接近某些数据,那么您可以利用数据并行性来获得更多带宽。但是,集群和PIM系统比单核CPU更难编程,并不是每个问题都基本上是数据并行的。因此,冯·诺伊曼的瓶颈很可能已经存在了一段时间。
答案 1 :(得分:1)
Von Neumann瓶颈来自代码和数据的共享内存总线。如果忽略当今处理器的复杂功能,并想象一个带有一些RAM和一些闪存的简单8位冯·诺依曼处理器,处理器将不断被迫等待RAM操作完成,然后再从闪存加载更多数据。今天,缓解主要通过处理器的L1和L2缓存以及嵌入在处理器中的分支预测逻辑来完成。可以将指令预加载到高速缓存中,并且可以自由使用存储器总线。并行化可以帮助特定的工作负载,但实际情况是,今天的计算范例并没有真正受到这个瓶颈的影响。处理器非常强大,存储器和总线速度非常快,如果您需要更多吞吐量,您可以为处理器添加更多缓存(正如英特尔使用Xeons,AMD使用Opteron)。并行化也是一种避免问题的方法,您的并行工作负载仍然受制于处理器体系结构所规定的相同规则。如果有的话,多线程应该会使问题变得更糟,因为多个工作负载竞争相同的内存总线。同样,解决方案只是在内存总线和处理器内核之间添加更多缓存。
随着记忆越来越快,处理器不再那么多,我们可能会再次看到这个问题成为一个问题。但后来人们说生物计算机是通用计算的未来,所以希望下一个主要架构能够考虑过去的错误。