我被要求测量一个解决多CPU系统微分方程的fortran程序的性能.我的雇主坚持认为我测量FLOP/s(每秒浮动操作)并将结果与基准(LINPACK)进行比较,但我不相信它是要走的路,因为没有人可以向我解释什么是FLOP.
我做了一些关于FLOP究竟是什么的研究,我得到了一些相当矛盾的答案.我得到的最受欢迎的答案之一是'1 FLOP =加法和乘法运算'.真的吗?如果是这样,再次,在物理上,究竟是什么意思?
无论我最终使用哪种方法,它都必须是可扩展的.一些版本的代码解决了具有数百万未知数的系统,并且需要数天才能执行.
在我的案例中,还有哪些其他有效的衡量绩效的方法(我的案例摘要是'fortran代码,它在数百个CPU上反复进行了大量的算术计算)?
只要您完全了解它所测量的内容,这是一个相当不错的性能指标.
FLOPS,顾名思义,FLoating point OPerations per Second,究竟是什么构成FLOP可能因CPU而异.(某些CPU可以执行加法和乘法作为一个操作,其他CPU不能,例如).这意味着作为一种性能指标,它与硬件非常接近,这意味着1)您必须知道您的硬件才能在给定的架构上计算理想的FLOPS,并且您必须了解您的算法和实现以了解如何它实际上由许多浮点运算组成.
无论如何,它是一个有用的工具,用于检查您如何利用CPU.如果您知道CPU在FLOPS中的理论峰值性能,您可以计算出使用CPU的浮点单元的效率,这通常是难以有效利用的单元之一.运行CPU能够运行30%FLOPS的程序具有优化空间.除非您更改基本算法,否则以70%运行的可能不会更有效率.对于像你这样的重数学算法,这几乎是衡量性能的标准方法.您可以简单地测量程序运行所需的时间,但这会因CPU而异.但是如果你的程序具有50%的CPU利用率(相对于峰值FLOPS计数),那么这是一个更加恒定的值(它'
但是知道"我的CPU能够实现X GFLOPS,而我实际上只实现了20%的吞吐量",这在高性能软件中是非常有价值的信息.这意味着除浮点操作之外的其他操作会阻止您,并阻止FP单元高效工作.由于FP单元构成了大部分工作,这意味着您的软件存在问题.
很容易衡量"我的程序在X分钟内运行",如果你认为这是不可接受的,那么你可以去"我想知道我是否可以砍掉30%的折扣",但你不知道这是否可行,除非你可以精确地计算出正在完成的工作量,以及CPU能够达到峰值的精确程度.如果您甚至不知道CPU是否能够从根本上每秒运行更多指令,那么您希望花多少时间来优化它?
通过在FP操作之间具有太多依赖性,或者通过具有太多分支或类似的阻止有效调度,很容易防止CPU的FP单元被有效利用.如果这就是让你的实现恢复的原因,你需要知道这一点.您需要知道"我没有获得应该可能的FP吞吐量,所以我的代码的其他部分显然阻止了FP指令在CPU准备发布时可用".
为什么还需要其他方法来衡量绩效?你的老板要求你制定FLOPS计数有什么问题?;)
我只想补充几点:
师是特别的.由于大多数处理器可以在一个周期内进行加法,比较或乘法,因此这些都被算作一次翻转.但分裂总是需要更长时间.多长时间取决于处理器,但HPC社区中有一种事实标准,即将一个部门计为4个触发器.
如果处理器具有融合乘法 - 加法指令,该指令在单个指令中进行乘法和加法 - 通常为A + = B*C - 则计为2次运算.
在区分单精度触发器和双精度触发器时要始终小心.能够实现如此多单精度千兆位的处理器可能只能实现许多双精度千兆位的一小部分.AMD Athlon和Phenom处理器的双精度触发器通常可以达到单精度的一半.ATI Firestream处理器通常可以使用单精度的1/5双精度触发器.如果有人试图向您出售处理器或软件包,并且他们只是引用翻牌而不说明哪些,您应该在其上打电话给他们.
术语megaflop,gigaflop,teraflop等是常用的.这些是指1000的因子,而不是1024.例如,1 megaflop = 1,000,000 flop/sec而不是1,048,576.与磁盘驱动器大小一样,对此存在一些混淆.