performance - 什么是 FLOP/s?它是衡量性能的一个很好的指标吗?

标签 performance benchmarking flops

我被要求测量一个在多 CPU 系统上求解微分方程的 Fortran 程序的性能。我的雇主坚持要求我测量 FLOP/s(每秒 float 操作)并将结果与​​基准进行比较( LINPACK ),但我不相信这是正确的方法,只是因为没有人可以向我解释什么是 FLOP .

我对 FLOP 到底是什么进行了一些研究,得到了一些非常矛盾的答案。我得到的最受欢迎的答案之一是“1 FLOP = 加法和乘法运算”。真的吗?如果是这样,那么从物理上来说,这到底意味着什么?

无论我最终使用什么方法,它都必须是可扩展的。代码的某些版本解决了具有数百万个未知数的系统,并且需要几天的时间才能执行。

在我的案例中,还有哪些其他有效的衡量性能的方法(我的案例摘要是“fortran 代码在数百个 CPU 上反复进行数天的大量算术计算)?

最佳答案

只要您准确理解它衡量的内容,这是一个相当不错的性能衡量标准。

FLOPS,顾名思义,是每秒的 float 操作数,FLOP 的具体构成可能因 CPU 的不同而不同。 (例如,某些 CPU 可以将加法和乘法作为一项运算执行,而其他 CPU 则不能)。这意味着作为一种性能衡量标准,它与硬件相当接近,这意味着 1) 您必须了解您的硬件才能在给定架构上计算理想的 FLOPS,并且您必须了解您的算法和实现以弄清楚如何计算它实际上包含许多浮点运算。

无论如何,它都是检查 CPU 利用率的有用工具。如果您知道 CPU 的理论峰值性能(以 FLOPS 为单位),您就可以计算出使用 CPU 浮点单元的效率,而浮点单元通常是最难有效利用的单元之一。运行 CPU 能够执行的 FLOPS 30% 的程序有优化的空间。除非您更改基本算法,否则以 70% 运行的效率可能不会提高很多。对于像您这样的数学密集型算法,这几乎是衡量性能的标准方法。您可以简单地测量程序运行所需的时间,但这根据 CPU 的不同而有很大差异。但是,如果您的程序的 CPU 利用率为 50%(相对于峰值 FLOPS 计数),那么这是一个更恒定的值(在完全不同的 CPU 架构之间它仍然会有所不同,但它比执行时间更加一致)。

但是,知道“我的 CPU 能够实现 X GFLOPS,而我实际上只实现了其中的 20%”,这在高性能软件中是非常有值(value)的信息。这意味着除浮点运算之外的其他东西会阻碍您,并阻止 FP 单元有效工作。由于 FP 单元构成了大部分工作,这意味着您的软件有问题。

衡量“我的程序在 X 分钟内运行”很容易,如果你觉得这是 Not Acceptable ,那么当然,你可以说“我想知道我是否可以削减 30%”,但你不知道这是否可能,除非您准确计算出正在完成多少工作,以及 CPU 在峰值时的能力。如果您甚至不知道 CPU 是否能够从根本上每秒运行更多指令,您需要花费多少时间来优化它?

由于 FP 操作之间存在过多的依赖关系,或者存在过多的分支或类似情况,从而妨碍高效调度,因此很容易阻止 CPU 的 FP 单元被有效利用。如果这就是阻碍您实现的原因,您需要知道这一点。您需要知道“我没有获得应有的 FP 吞吐量,因此很明显,当 CPU 准备好发出 FP 指令时,我的代码的其他部分正在阻止 FP 指令可用”。

为什么需要其他方法来衡量性能?仅仅按照老板的要求计算出 FLOPS 计数有什么问题吗? ;)

关于performance - 什么是 FLOP/s?它是衡量性能的一个很好的指标吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57742787/

相关文章:

performance - 比较 Lua 和 Mono

Android sql事务性能

profiling - 基准测试和分析之间的区别

编译器优化对使用 PAPI 的 FLOP 和 L2/L3 缓存未命中率的影响

mysql - 在 MySQL 中实现快速插入大量数据的最佳方法是什么?

c++ - 我正在寻找可以在图形编辑程序中进行的任何优化

node.js - 如何对基于 websocket 的 Node.js 应用程序进行基准测试?

Golang 数据竞争甚至使用自定义并发映射的互斥体

c++ - 超过理论峰值 FLOPS 基准

c++ - 当我们计算Gflop时,我们需要考虑索引计算吗?