FLOP/s是什么,它是性能的一个好指标吗?

7 浏览
0 Comments

FLOP/s是什么,它是性能的一个好指标吗?

我被要求在多CPU系统上测量解决微分方程的Fortran程序的性能。我的雇主坚持要我测量每秒浮点运算数(FLOP/s)并将结果与基准测试(LINPACK)进行比较,但我对此并不认同,因为没有人能解释给我FLOP是什么。\n我对FLOP的确切含义进行了一些研究,得到了一些相互矛盾的答案。我得到的最流行的答案之一是“1 FLOP = 一次加法和一次乘法运算”。这是真的吗?如果是这样,从物理上讲,这到底是什么意思?\n无论我最终采用哪种方法,它都必须具有可扩展性。代码的某些版本解决了具有数百万未知数的系统,并需要几天的执行时间。\n在我这种情况下(即“Fortran代码在数百个CPU上反复进行大量算术计算数天”),还有其他有效的性能测量方法吗?

0
0 Comments

FLOP/s是指每秒执行的浮点数运算次数。它是衡量性能的一种指标,但并不是一个很好的指标。

FLOP是浮点数运算的简称,而FLOPS可以有两个不同的含义:

1. FLOP的复数形式,表示一个操作需要多少个FLOP(例如,“操作X需要50个FLOPs”);

2. 每秒执行的浮点数运算次数(即每秒的浮点数数学运算次数)。

在不清楚上下文的情况下,可以通过将前者写为“FLOPs”,后者写为“FLOP/s”来消除歧义。

FLOPs之所以被称为FLOPs,是为了区别于其他类型的CPU操作,如整数运算、逻辑运算、位运算、内存操作和分支操作,因为它们具有不同的开销(即“所需时间不同”)。

“FLOP计数”的做法可以追溯到科学计算的早期,当时FLOPs相对非常昂贵,每个FLOP需要很多CPU周期。例如,80387数学协处理器在进行单次乘法时需要大约300个周期。那个时候还没有流水线技术,CPU时钟速度和内存速度之间的差距也没有真正拉开:内存操作只需要一两个周期,分支(“决策”)也同样廉价。在那个时候,如果你能用十几次内存访问来代替一个FLOP,你就能获得收益。如果你能用十几次分支来代替一个FLOP,你也能获得收益。因此,在过去,计算FLOPs并不太关注内存引用和分支,因为FLOPs在执行时间上占据主导地位,因为它们相对于其他操作来说非常昂贵。

最近,情况发生了逆转。FLOPs变得非常廉价 - 任何现代Intel核心每个周期可以执行大约两个FLOPs(尽管除法仍然相对较昂贵),而内存访问和分支相对来说更加昂贵:L1缓存命中可能需要3或4个周期,从主存中读取可能需要150-200个周期。在这种情况下,消除一个FLOP以换取一个内存访问并不会带来任何收益;实际上,这是不太可能的。同样,即使是多余的,执行一个FLOP通常比决定是否执行它更便宜。这与25年前的情况完全相反。

不幸的是,作为算法优越性的绝对度量,盲目计算FLOP的做法已经持续了很长一段时间。现代科学计算更多地涉及内存带宽管理 - 尝试保持执行FLOPs的执行单元始终具有数据,而不仅仅是减少FLOPs的数量。提到LINPACK(20年前基本上已经被LAPACK淘汰)使我怀疑你的雇主可能是一个一直没有内化建立性能期望不仅仅是FLOP计数的非常老派的学派。如果一个求解器执行的FLOPs是另一个的两倍,但具有更有利的内存访问模式和数据布局,它仍然可能比另一个快20倍。

总结起来,计算密集型软件的性能评估比以前复杂得多。FLOPs变得廉价这一事实受到内存操作和分支开销的巨大变化的影响。在评估算法时,简单的FLOP计数不再能够提供关于整体性能期望的信息。

也许更好的性能期望和评估方法是所谓的“roofline模型”。这个模型并不完美,但它能够让你同时考虑浮点数和内存带宽的权衡,提供更加有用和深入的“二维图像”,使得性能测量和性能期望能够进行比较。

总之,FLOP/s是衡量性能的一种指标,但并不是一个很好的指标。在现代科学计算中,性能评估变得比以前更加复杂,需要考虑内存带宽和浮点数运算之间的权衡。

0
0 Comments

FLOP/s是衡量性能的一种指标,它代表每秒钟可以执行的浮点运算次数。然而,FLOP/s并不是一个完美的性能衡量标准。下面的内容提到了一些关于FLOP/s的问题以及解决方法。

首先,这段内容指出了除法运算的特殊性。由于大多数处理器可以在一个周期内执行加法、比较或乘法,因此这些运算都被计为一个FLOP。但是除法运算总是需要更长的时间。具体需要多长时间取决于处理器,但HPC社区有一种约定俗成的标准,认为一个除法运算相当于4个FLOP。

其次,如果处理器具有融合乘加(fused multiply-add)指令,可以在一条指令中执行乘法和加法,通常表示为A += B * C,那么这将被计为2个操作。

再次,需要注意区分单精度FLOP和双精度FLOP。一个处理器可能能够达到很多单精度的Gflop,但可能只能达到相对较少的双精度Gflop。例如,AMD Athlon和Phenom处理器的双精度FLOP可能只有单精度FLOP的一半。而ATI Firestream处理器的双精度FLOP可能只有单精度FLOP的五分之一。因此,如果有人试图向你销售处理器或软件包,并且只给出FLOP的数量而没有指明是单精度还是双精度,你应该要求他们明确。

最后,这段内容提到了在计算FLOP时使用的单位。常见的单位为兆(megaflop)、吉(gigaflop)、太(teraflop)等。这些单位是以1000为基数的,而不是1024。例如,1兆FLOP = 1,000,000次浮点运算/秒,而不是1,048,576次。就像磁盘驱动器大小一样,这也会引起一些混淆。

总结起来,FLOP/s是衡量性能的一种指标,但并不是一个完美的衡量标准。在使用FLOP/s进行性能比较时,需要注意除法运算的特殊性、区分单精度和双精度FLOP,以及正确理解FLOP的单位。

0
0 Comments

FLOP/s是衡量性能的一个相当不错的指标,只要你明确它衡量的是什么。FLOP/s是每秒浮点运算次数,具体的FLOP是根据CPU而定的(有些CPU可以将加法和乘法作为一次操作,而其他CPU则不能)。因此,作为一个性能指标,它与硬件相当接近,这意味着你必须了解你的硬件以计算给定架构上的理想FLOP/s,并且必须了解你的算法和实现以确定它实际包含多少浮点运算。

无论如何,这是一个检查你如何有效利用CPU的有用工具。如果你知道CPU在FLOP/s方面的理论峰值性能,你就可以计算出你使用CPU的浮点单位的效率,这通常是难以有效利用的单位之一。一个运行在CPU能力的30%的程序,有优化的空间。一个运行在70%的程序,除非你改变基本算法,否则可能不会变得更高效。对于数学密集型算法,这是衡量性能的标准方法。你可以简单地测量程序运行的时间,但这个时间会因CPU而异。但是,如果你的程序的CPU利用率为50%(相对于峰值FLOP/s计数),那么这个值会更加稳定(它仍然会因不同的CPU架构而异,但比执行时间更加一致)。

但是,了解“我的CPU能力是X GFLOP/s,而我实际上只能达到20%的吞吐量”是非常有价值的高性能软件。这意味着除了浮点操作外,还有其他因素阻碍了你的软件,使FP单位无法高效工作。由于FP单位占据了大部分工作量,这意味着你的软件存在问题。

测量性能是否需要其他方法?为什么不只是按照你的老板的要求计算FLOP/s?;)

感谢你的帮助!我不知道CPU架构有固定的FLOP速率值。

事实上,并没有。它们只有对每种类型的指令需要多长时间以及每个周期可以发出多少次指令的明确限制。通过这些限制,你可以推导出理论峰值FLOP/s。

如同jalf最后的评论所说,要从CPU获得理论峰值FLOP/s非常困难,因为这意味着你的计算结构是以每个周期获得完全FP指令为目标的。这在实际应用中并不总是发生,但它确实给出了如果你的代码受限于计算方面,你可以获得多少潜在的性能提升。如果你想了解超级计算机如何测量FLOP/s,请参考Top500.org的方法:top500.org/faq。他们在该页面上解释了他们的基准测试。

正如所说,你可以基本上忘记在任何CPU上达到峰值FLOP/s。这是不可能的。在我看到的大多数应用中,如果你达到了CPU理论峰值FLOP/s的50%,那就可以给自己鼓掌了。也许你能够达到70%,但这样你真的应该算是幸运的了。但是,如果你只有10%的运行效率(这种情况会经常发生),那么可能还有改进的空间。

但是与之相关的问题是:为什么性能以每秒FLOP(FLOPS)计量,而不考虑每秒整数操作的数量?

因为FLOPS起源于科学计算领域,而这些人对整数性能并不是很在意。他们需要的是浮点数计算,而这个数字实际上是唯一重要的。从历史上看,整数指令比浮点操作便宜得多,所以与浮点操作的效率相比,整体性能几乎总是占优势的。

当然,还有其他的性能衡量指标。MIPS(每秒百万条指令)是另一个更加侧重于整数的指标。基本上,人们根据自己关心的方面来衡量性能。而FLOPS对于那些运行大量浮点代码的人来说是有趣的。:)

如今,内存往往是效率的限制因素。即使你的数据在缓存中很热,如果你每次将数据加载到寄存器中时都无法充分利用它,那么你将在存储和/或加载操作中出现瓶颈,而不会饱和SIMD FMA单元。(例如,在Haswell及以后的处理器上,每4个uop中有2个必须是FMA,而带索引寻址模式无法与FMA保持微融合;它们会分裂为一个独立的uop)。

因此,计算强度是与CPU上的FP执行资源越来越多有关的问题。例如,一个简单的点积在每个FMA上有2次加载的瓶颈,因此即使没有缓存丢失,它的效率也只能达到50%。你可能需要将更多的工作结合到对数据的每次传递中,特别是如果你只缓存块用于L2缓存,而不是L1d缓存,以避免在L2缓存带宽上出现瓶颈。(或者对于相同的带宽,需要两倍的计算强度)。

我想我的真正观点是,越来越多的算法在现代CPU上可能无法接近100%的FLOP/s。对于那些可以的算法来说,要达到那个水平变得越来越困难(需要更加仔细地进行缓存块操作)。因此,如果你的代码在当前系统上已经在前端指令吞吐量、加载或存储方面出现瓶颈,或者内存带宽或缓存丢失,新的CPU可能以你的算法无法利用的方式提供更多的FLOP/s。但是,如果你找不到算法上的节省,作为当前程序利用当前CPU的一种上限,它也不错。

0