parallel-processing - 并行处理如何解决冯·诺依曼的瓶颈?

标签 parallel-processing bus von-neumann

我一直在阅读冯·诺依曼(Von Neumann)和AFAIK的瓶颈,问题在于CPU应该获取或修改数据操作,但不能同时获取;因为它们都需要访问相同的内存总线。
因此,问题主要在于总线传输速率有限。
我已经读过有关如何缓解此问题的信息,它提到并行处理应该解决它,它不仅仅依赖于一个内核,因此当一个内核卡在提取操作中时,其他内核将以一种单独的方式工作,大大减少了计算时间。

这是正确的理解吗?如果是这样,难道不是所有这些内核都共享同一条总线到内存吗?哪个从一开始就成为瓶颈?

最佳答案

没有。冯·诺依曼瓶颈是指处理器和内存位于慢速总线的相对两侧的事实。如果要计算某些东西,则必须将输入跨总线移动到处理器。然后,您必须在计算完成时将输出存储到内存中。您的吞吐量受内存总线速度的限制。

快取

高速缓存通过将少量经常使用的数据保持在处理器附近,有助于减轻许多工作负载的此问题。如果您的工作量像许多一样重用了许多数据,那么您将从缓存中受益。但是,如果您要处理的数据集太大而无法容纳在高速缓存中,或者如果您的算法没有很好的数据重用性,则高速缓存可能不会带来太多好处。考虑处理一个非常大的数据集。您需要加载所有数据,并将其至少存储回去一次。如果幸运的话,您的算法只需要查看每个数据块一次,所有重用的值都将保留在缓存中。如果不是这样,则每个数据元素在内存总线上的回声可能会超过一次。

并行处理

并行处理是一个相当宽泛的术语。根据您的操作方式,您可能会或可能不会获得更多的带宽。

共享内存

如今,共享内存处理器的实现方式根本无法解决冯·诺依曼的瓶颈。如果有的话,拥有更多的内核会对总线造成更大的压力,因为现在更多的处理器需要从内存中获取数据。您将需要更多的带宽来满足所有需求。恰当的例子:许多并行算法受内存限制,它们无法利用现代多核芯片上的所有内核,特别是因为它们无法足够快地获取数据。核心数量不断增加,即使每个处理器的总带宽增加,每个核心的带宽也可能会在限制中减少。

NUMA

现代内存总线变得越来越复杂,您可以做一些事情以更有效地使用它们。例如,在NUMA机器上,某些存储库比其他存储库更靠近某些处理器,并且如果您高效地布置数据,则可以获得比仅从RAM中的任何地方盲目提取数据更大的带宽。但是,扩展共享内存非常困难-请参阅Distributed Shared Memory Machines,以了解将共享内存计算机扩展到数千个内核的原因。

分布式内存

分布式存储机是并行机的一种。这些通常称为集群-它们基本上只是同一网络上试图执行一项常见任务的一堆节点。如果每个处理器仅从其本地内存获取,则可以在整个群集上获得线性带宽扩展。但是,这需要您有效地布置数据,以便每个处理器都有自己的块。人们称这种为数据并行计算。如果您的数据大部分是数据并行的,则可能可以使用很多处理器,并且可以并行使用所有内存带宽。如果您无法并行化工作负载,或者无法将数据分解成大块以便每个数据块主要由一个或几个节点处理,那么您将回到具有顺序工作负载的状态,并且仍然受到约束通过单核的带宽。

内存处理器(PIM)

人们已经在寻找替代节点体系结构来解决冯·诺依曼瓶颈。最常引用的一个可能是Processor-in-memory, or PIM。在这些体系结构中,为了解决内存总线问题,您在内存中嵌入了一些处理器,有点像集群,但规模较小。每个小核通常可以对其本地数据执行一些不同的算术运算,因此您可以非常快速地执行某些运算。同样,尽管很难以一种实际上使这种类型的处理有用的方式来布置数据,但是某些算法可以利用它。

摘要

总而言之,通用计算机中的冯·诺依曼瓶颈是处理器可以对内存中任何地址的数据执行任何操作的瓶颈,其原因是必须将数据移至处理器以进行任何计算。

简单地构建并行计算机并不能解决问题,特别是如果所有内核都在内存总线的同一侧。如果您愿意拥有许多处理器并进行扩展,以使它们比其他数据更接近某些数据,那么您可以利用数据并行性来获得更多带宽。但是,集群和PIM系统比单核CPU难编程,而且并非每个问题都基本上是数据并行的。因此,冯·诺依曼(Von Neumann)瓶颈可能会持续一段时间。

关于parallel-processing - 并行处理如何解决冯·诺依曼的瓶颈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37083067/

相关文章:

python - scikit-learn如何处理多个n_jobs参数?

c# - 如何正确取消 Parallel.Foreach?

python-2.7 - 并行执行时,Tensorflow 的 tf.while_loop 是否自动捕获依赖项?

matlab - 在并行matlab中运行两个函数

.net - .NET Micro Framework 是否支持 CAN 总线?

c - dbus 总是需要总线吗

windows - 如何访问Windows PC的ISA总线?

lambda - 冯诺依曼机器和 Lambdas

architecture - 冯·诺依曼架构有何优点?

assembly - 原始图灵机上的操作的汇编语言等价物是什么?