为什么计算成本以 Floating Pt 来衡量。行动。在并行计算时代?

计算科学 算法 并行计算 表现 复杂
2021-12-08 09:16:32

在并行计算时代,在我看来,算法(也是基本算法,如矩阵向量乘法)应该通过它们的依赖步骤(使用之前步骤的结果)而不是浮点运算的总数来衡量。

例如,不考虑内存访问,矩阵向量乘法有O(n3)浮点运算,但只有 2 个相关步骤(首先进行乘法,然后进行加法)

当然,即使使用现代 GPU,您也无法并行计算无限多的步骤,将无限多的数字相加或缓存无限多的值,但为了弥补这一点,您可以将算法的“相关步长”乘以一个因子(取决于FPU 的数量、缓存大小等以及算法的最大需求)以获得合理的估计。

感谢您的意见/参考/反对/警告/陷阱

注意:我不是计算机专家(尤其是不关心硬件),只是一个不时使用 MATLAB 的数学家

2个回答

事实上,精确的操作总数很少被用作计算成本的衡量标准。相反,您会经常看到计算顺序(即O(n3))。这个“大 O”符号大致意味着操作的数量与n3并告诉您操作总数如何随着未知数的变化而扩展。这是计算复杂性的一个非常有用的度量,因为它可以在您扩大问题规模时为您提供相对成本的估计。

考虑一个简单的例子:求解线性方程组
高斯消元法是O(n3)因此,如果您将未知数增加一倍,则需要23=8倍。如果您正在执行 3D 计算和一半的网格间距,您将拥有23=8网格点数(未知数)的倍数,需要做83=512解决您的线性系统的工作量要多倍。
代数多重网格(AMG) 求解线性系统O(n)时间。尽管使用 AMG 求解一个小型方程组可能需要更长的时间,但随着您增加未知数的数量,工作的扩展速度会慢得多。在这种情况下,未知数的 8 倍意味着工作量的 8 倍。

上述讨论完全独立于并行与串行执行。一般来说,并行性能是根据并行效率来讨论的。并行效率通常取决于问题大小和进程数量,定义为

Efficiency(n,p)=T1(n)pTp(n,p)
在哪里n是未知数的数量,p是进程数,并且Tp是运行时使用p过程。例如,具有 50% 并行效率的算法在 10 核上的运行速度是单核的 5 倍(而不是 10 核上的 10 倍)。

请注意,并行效率不会影响计算顺序,反之亦然。计算复杂度反映了必须执行的浮点运算的数量,它不依赖于使用的进程数量。另一方面,并​​行效率很大程度上取决于算法的通信要求,因为它与通信带宽和延迟密切相关。如果每个进程都必须始终相互通信,那么并行效率将非常低。另一方面,不需要进程之间通信的算法被称为“令人尴尬的并行”,并且可以实现近 100% 的并行效率。这是典型的蒙特卡洛算法。

尽管在大型计算之外它可能没有被广泛讨论,但由于许多核心计算机的普及,并行效率正迅速变得几乎与计算顺序一样重要。

首先,关于术语。FLOPS是“每秒浮点运算”,它们通常不用于衡量算法的性能,而是用于衡量机器的性能。

我假设您的意思是算法的复杂性是用完成这项工作所需的浮点运算总数来衡量的(可能有人可以将其写为带有小写“s”的 FLOP)。

我认为即使在并行计算时代,这也是一种有用的措施。FLOP 只是告诉您需要完成多少工作。当我遇到一个需要更多 FLOP 的问题时,甚至我的并行机器在合理的时间内都无法提供,我迷失了方向。就目前而言,FLOP 为您提供了所需时间的下限

但是,我同意对于并行机器,该度量已变得不那么有用,因为几乎没有算法实际上能够在单个问题上使用机器的全部性能。因此,您对替代措施的想法对我来说似乎是合理的。我不知道任何替代方案,但我从未寻找过。也许您想详细说明您的想法?

顺便说一句:疯狂的是,超级计算中心仍然主要看他们的机器可以用于单个问题的 FLOPS 数量,这就是TOP 500基准就是一切。因此,他们购买了极其昂贵的网络互连来连接整台机器。然而,随着下一代百亿亿级计算机的出现,将只有少数算法能够真正使用它。另一方面,在将机器拆分为更小的子系统时,有很多问题可以从计算能力中获益。这就是超级计算中心在超过 90% 的时间里实际发生的情况。尽管如此,这类问题仍被超级计算社区回避为“可并行化”,因为它们不能被用来争论昂贵的互连。