为啥数学库经常被 FLOPS 比较?

Posted

技术标签:

【中文标题】为啥数学库经常被 FLOPS 比较?【英文标题】:Why are math libraries often compared by FLOPS?为什么数学库经常被 FLOPS 比较? 【发布时间】:2015-05-22 22:12:41 【问题描述】:

数学库经常根据 FLOPS 进行比较。当我看到 FLOPS 与大小的关系图以及几个不同数学库的点集时,向我传达了哪些信息?

如果比较是在相同算法的两个实现之间或在两个不同硬件上的相同软件之间进行比较,那么作为性能衡量标准的 FLOPS 对我来说会更有意义。我不明白为什么它是比较矩阵-矩阵乘法之类的合适或流行的方法。

这是否意味着底层算法几乎相同,并且通过最小化开销以最快速度提供浮点单元的代码获胜?

例子比比皆是。

http://eigen.tuxfamily.org/index.php?title=Benchmark

https://code.google.com/p/blaze-lib/wiki/Benchmarks

https://software.intel.com/en-us/articles/a-simple-example-to-measure-the-performance-of-an-intel-mkl-function

另一方面,这些 LAPACK 和 Armadillo 基准测试使用给定操作的绝对时间,这对我来说更有意义。

http://www.netlib.org/lapack/lug/node71.html

http://arma.sourceforge.net/speed.html

相关:

What is FLOP/s and is it a good measure of performance?

【问题讨论】:

【参考方案1】:

通常,人们比较数学库是为了选择能够最大限度地减少程序运行时间的库。对于此类基准,需要考虑两件事:库在给定输入上的性能以及该输入是否代表您的用例。

如果我们假设每个任务(例如向量缩放)需要相同数量的浮点操作,那么人们会期望具有最多 FLOPS 的库首先完成。

在某些情况下,假设每个库将执行相同数量的浮点运算是合理的。但是完全有可能两个库对于同一个任务需要不同数量的浮点运算(例如矩阵矩阵乘法)。如果是这种情况,那么库可能会执行更少的 FLOPS,但完成的时间会比执行更多 FLOPS 的库要短。因此,在这些情况下,总运行时间是合理的。如果作者在 FLOPS 中发布比较,这意味着他们相信每个库总共执行相同数量的操作;或者只是将理论上完成任务所需的操作数除以总运行时间(这也很常见)。您需要查看基准方法。

比较性能(例如 FLOPS)与大小的目的是帮助人们了解其用例的代表性输入的性能。如果你知道你会有很多小向量,比如小于 10 的大小,那么你就不会关心库对于 1gb 大小的向量有多快,也不希望这些输入影响比较。

一般来说,计算 FLOPS 很流行(部分原因可能是因为它很容易向数学家解释)。我想一个动机是说“你可以在 10000 FLOPS 时出售 size=10 的向量,但在 100 FLOPS 时出售 size=100 的向量”比说“你可以在 0.001 秒内缩放 size=10 的向量但是大小= 1 秒内 100 个向量。”如果您报告总运行时间,您可能希望按输入大小进行缩放以进行比较。

【讨论】:

【参考方案2】:

在高性能计算中,一个目标通常是在最短的时间内尽可能多地利用硬件功能。这最大限度地减少了等待结果所花费的时间(由人类或其他对时间敏感的系统)。在大型计算设施中,运营成本(电力消耗、维护人力等)通常 - 大致 - 与时间保持不变,因此计算时间直接转化为底线(进行计算所支付的资金)。

FLOPS 衡量算法对 CPU 的利用程度。算法的 FLOPS 测量值除以 CPU 能够执行的 FLOPS 数得出 0 到 1 之间的分数。越接近 1,算法使用 CPU 的效率越高,这意味着在那种类型的CPU(即算法产生解决方案的速度更快,因此净成本更低)。

结果特定于 CPU(指令集)和算法。但是,如果一个算法在特定 CPU 上给出了一个小的结果,那么它就没有很好地利用那个 CPU。这可以推动选择不同的算法、不同的编译设置(例如,进行不同的优化或选择不同的指令)、选择算法将更有效地运行的服务器场等。对于重复进行的大型计算(每天) 与使用 CPU 效率低的算法相比,使用高效利用 CPU 的算法的成本收益可能很大。

【讨论】:

以上是关于为啥数学库经常被 FLOPS 比较?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Javascript 比较运算符在数学上不一致?

Linux aarch64交叉编译之glm数学库

Python标准库12 数学与随机数 (math包,random包)

Eigen的速度为啥这么快

为啥即使在包含 math.h 并使用 -lm 链接到数学库之后我也会收到“未定义的符号:.sqrtf”

为啥TensorFlow要重新实现很多数学方程?