5 回答
FLOPS 是每秒的浮点运算。要测量 FLOPS,您首先需要执行此类操作的代码。如果你有这样的代码,你可以衡量的是它的执行时间。您还需要总结或估计(而不是测量!)所有浮点运算并将其除以测量的壁时间。您应该计算所有普通操作,例如加法,减法,乘法,除法(是的,即使它们更慢并且更好地避免,它们仍然是 FLOPs ..)。小心你怎么数!您在源代码中看到的很可能不是编译器在所有优化之后产生的。为确保您可能需要查看程序集..
FLOPS 与每秒操作数不同。因此,即使某些架构只有一条 MAD(乘加)指令,它们仍然算作两个 FLOP。同样的 SSE 指令。您将它们视为一条指令,尽管它们执行不止一个 FLOP。
FLOPS 并非完全没有意义,但是在将 FLOPS 与 sb 进行比较时需要小心。elses FLOPS,尤其是硬件供应商。例如,假设 MAD 操作,NVIDIA 为其卡提供了峰值 FLOPS 性能。因此,除非您的代码有这些,否则您将永远无法获得这种性能。要么重新考虑算法,要么将峰值硬件 FLOPS 修改为正确的因子,您需要为自己的算法弄清楚!例如,如果您的代码只执行乘法,您可以将其除以 2。正确计数可能会使您的代码从次优变为非常高效,而无需更改任何一行代码。
您可以使用 CPU 性能计数器让 CPU 自己计算它用于特定程序的浮点操作数。然后将其除以运行时间就很简单了。在 Linux 上,性能工具可以非常轻松地完成此操作,我在我的博客上对此进行了详细说明:
通常你使用一些众所周知的基准。像 MIPS 和 megaFLOPS 这样的东西一开始并没有多大意义,如果你不将它们限制在特定的基准测试中,那么即使是那一点点意义也会丢失。
例如,通常在“drystone MIPS”中引用整数速度,在“Linpack megaFLOPS”中引用浮点数。其中,“drystone”和“Linpack”是用于进行测量的基准的名称。
IOPS 是 I/O 操作。它们大致相同,但在这种情况下,关于使用哪个基准测试并没有那么多一致意见(尽管 SPC-1 似乎相当流行)。
这是一个高度特定于体系结构的问题,对于一个幼稚/基本/开始的开始,我建议找出在您的特定硬件上需要多少操作 1 乘法,然后进行大型矩阵乘法,看看需要多长时间。然后您可以轻松估计特定硬件的 FLOP
测量触发器的行业标准是众所周知的Linpack或HPL 高性能 linpack,请尝试查看源代码或自己运行它们
我也会将此答案称为极好的参考
FLOP 的定义不明确。mul FLOPS 与 add FLOPS 不同。您必须提出自己的定义,或者从著名的基准中获取定义。