加速上限
Upper bound on speedup
我的 MPI 经验表明,加速不会随着我们使用的节点数量线性增加(因为通信成本)。我的经历是这样的:.
今天一位演讲者说:"Magically (smiles), in some occasions we can get more speedup than the ideal one!"。
他的意思是,理想情况下,当我们使用4个节点时,我们将获得4的加速比。但在某些情况下,我们可以使用4个节点获得大于4的加速比!该主题与 MPI 相关。
这是真的吗?如果是这样,任何人都可以提供一个简单的例子吗?又或者他正在考虑在应用中加入多线程(他赶时间赶快走,没法商量)?
不太确定这是主题,但这里什么都没有...
当您在使用 MPI 将数据分布在内存中时并行化代码时,通常会出现这种超线性加速。在某些情况下,通过跨多个节点/进程分布数据,您最终会拥有足够小的数据块来处理适合处理器缓存的每个单独进程。这种缓存效应可能会对代码的性能产生巨大的影响,从而大大提高速度并补偿 MPI 通信需求的增加......这在许多情况下都可以观察到,但这并不是你真正可以指望的事情用于补偿较差的可扩展性。
您可以观察到这种超线性可扩展性的另一种情况是,当您使用一种算法来分配在大型集合中查找特定元素的任务时:通过分配您的工作,您最终可以在一个的 processes/threads 几乎立即找到了结果,只是因为它恰好给出了非常接近答案的索引范围。但是这种情况比前面提到的缓存效果更不可靠
希望这能让您了解什么是超线性。
并行效率(加速/并行执行单元的数量)超过统一性并不少见。
主要原因是并行程序可用的总缓存大小。随着 CPUs(或核心)的增加,一个人可以访问更多的高速缓存。在某些时候,大部分数据都适合缓存,这大大加快了计算速度。另一种看待它的方式是,您使用的 CPUs/cores 越多,每个人获得的数据部分就越小,直到该部分实际上可以放入个人 CPU 的缓存中。不过,这迟早会被通信开销取消。
此外,您的数据显示了与在单个节点上执行相比的加速。在使用 MPI 进行节点内数据交换时,使用 OpenMP 可以消除一些开销,因此与纯 MPI 代码相比可以实现更好的加速。
问题来自错误使用的术语ideal speed-up。理想情况下,人们会考虑缓存效应。我宁愿使用 linear 来代替。
已经提到了缓存,但这不是唯一可能的原因。例如,您可以想象一个并行程序,它没有足够的内存来存储它在低节点数时的所有数据结构,但在高节点数时却存在。因此,在低节点数时,程序员可能不得不将中间值写入磁盘,然后再次将它们读回,或者在需要时重新计算数据。然而,在高节点数时,不再需要这些游戏,程序可以将所有数据存储在内存中。因此,超线性加速是可能的,因为在更高的节点数下,代码只是通过使用额外的内存来避免 I/O 或计算来做更少的工作。
这确实与其他答案中提到的缓存效果相同,在可用时使用额外的资源。这就是真正的诀窍 - 更多节点不仅意味着更多核心,还意味着更多资源,因此如果您还可以使用其他额外资源来达到良好效果,那么加速确实可以衡量您的核心使用情况超线性加速。
我的 MPI 经验表明,加速不会随着我们使用的节点数量线性增加(因为通信成本)。我的经历是这样的:
今天一位演讲者说:"Magically (smiles), in some occasions we can get more speedup than the ideal one!"。
他的意思是,理想情况下,当我们使用4个节点时,我们将获得4的加速比。但在某些情况下,我们可以使用4个节点获得大于4的加速比!该主题与 MPI 相关。
这是真的吗?如果是这样,任何人都可以提供一个简单的例子吗?又或者他正在考虑在应用中加入多线程(他赶时间赶快走,没法商量)?
不太确定这是主题,但这里什么都没有...
当您在使用 MPI 将数据分布在内存中时并行化代码时,通常会出现这种超线性加速。在某些情况下,通过跨多个节点/进程分布数据,您最终会拥有足够小的数据块来处理适合处理器缓存的每个单独进程。这种缓存效应可能会对代码的性能产生巨大的影响,从而大大提高速度并补偿 MPI 通信需求的增加......这在许多情况下都可以观察到,但这并不是你真正可以指望的事情用于补偿较差的可扩展性。
您可以观察到这种超线性可扩展性的另一种情况是,当您使用一种算法来分配在大型集合中查找特定元素的任务时:通过分配您的工作,您最终可以在一个的 processes/threads 几乎立即找到了结果,只是因为它恰好给出了非常接近答案的索引范围。但是这种情况比前面提到的缓存效果更不可靠
希望这能让您了解什么是超线性。
并行效率(加速/并行执行单元的数量)超过统一性并不少见。
主要原因是并行程序可用的总缓存大小。随着 CPUs(或核心)的增加,一个人可以访问更多的高速缓存。在某些时候,大部分数据都适合缓存,这大大加快了计算速度。另一种看待它的方式是,您使用的 CPUs/cores 越多,每个人获得的数据部分就越小,直到该部分实际上可以放入个人 CPU 的缓存中。不过,这迟早会被通信开销取消。
此外,您的数据显示了与在单个节点上执行相比的加速。在使用 MPI 进行节点内数据交换时,使用 OpenMP 可以消除一些开销,因此与纯 MPI 代码相比可以实现更好的加速。
问题来自错误使用的术语ideal speed-up。理想情况下,人们会考虑缓存效应。我宁愿使用 linear 来代替。
已经提到了缓存,但这不是唯一可能的原因。例如,您可以想象一个并行程序,它没有足够的内存来存储它在低节点数时的所有数据结构,但在高节点数时却存在。因此,在低节点数时,程序员可能不得不将中间值写入磁盘,然后再次将它们读回,或者在需要时重新计算数据。然而,在高节点数时,不再需要这些游戏,程序可以将所有数据存储在内存中。因此,超线性加速是可能的,因为在更高的节点数下,代码只是通过使用额外的内存来避免 I/O 或计算来做更少的工作。
这确实与其他答案中提到的缓存效果相同,在可用时使用额外的资源。这就是真正的诀窍 - 更多节点不仅意味着更多核心,还意味着更多资源,因此如果您还可以使用其他额外资源来达到良好效果,那么加速确实可以衡量您的核心使用情况超线性加速。