cag*_*dag 41 performance benchmarking flops
我被要求测量一个解决多CPU系统微分方程的fortran程序的性能.我的雇主坚持认为我测量FLOP/s(每秒浮动操作)并将结果与基准(LINPACK)进行比较,但我不相信它是要走的路,因为没有人可以向我解释什么是FLOP.
我做了一些关于FLOP究竟是什么的研究,我得到了一些相当矛盾的答案.我得到的最受欢迎的答案之一是'1 FLOP =加法和乘法运算'.真的吗?如果是这样,再次,在物理上,究竟是什么意思?
无论我最终使用哪种方法,它都必须是可扩展的.一些版本的代码解决了具有数百万未知数的系统,并且需要数天才能执行.
在我的案例中,还有哪些其他有效的衡量绩效的方法(我的案例摘要是'fortran代码,它在数百个CPU上反复进行了大量的算术计算)?
jal*_*alf 48
只要您完全了解它所测量的内容,这是一个相当不错的性能指标.
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计数有什么问题?;)
Die*_*nte 27
我只想补充几点:
师是特别的.由于大多数处理器可以在一个周期内进行加法,比较或乘法,因此这些都被算作一次翻转.但分裂总是需要更长时间.多长时间取决于处理器,但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.与磁盘驱动器大小一样,对此存在一些混淆.
IMO 的旧问题,如果流行,答案并不完全正确。
“FLOP”是浮点数学运算。“FLOPS”可能意味着以下两种情况之一:
在上下文中不清楚的地方,通常通过将前者写为“FLOPs”而将后者写为“FLOP/s”来消除歧义。
所谓的 FLOP 是为了将它们与其他类型的 CPU 运算区分开来,例如整数数学运算、逻辑运算、按位运算、内存运算和分支运算,这些运算具有不同的成本(读取“花费不同的时间长度”)与他们。
“FLOP 计数”的实践可以追溯到科学计算的早期,相对而言,FLOP 非常昂贵,每个都占用许多 CPU 周期。例如,80387 数学协处理器进行一次乘法运算需要大约 300 个周期。这是在流水线之前以及 CPU 时钟速度和内存速度之间的鸿沟真正打开之前的时间:内存操作只需要一两个周期,而分支(“决策”)同样便宜。那时,如果您可以消除单个 FLOP 以支持十几个内存访问,那么您就获得了收益。如果您可以消除单个 FLOP 而有利于十二个分支,那么您就获得了收益。所以,在过去,计算 FLOPs 是有意义的,而不用太担心内存引用和分支,因为 FLOPs 强烈支配执行时间,因为它们相对于其他类型的操作来说非常昂贵。
最近,情况发生了逆转。FLOP 变得非常便宜——任何现代英特尔内核每个周期可以执行大约两个 FLOP(尽管除法仍然相对昂贵)——并且内存访问和分支相对昂贵得多:L1 缓存命中可能花费 3 或 4 个周期,从主内存成本 150-200。考虑到这种反转,消除有利于内存访问的 FLOP 不再会导致增益;事实上,这不太可能。类似地,即使是多余的,“只做”一个 FLOP 通常也比决定是否做要便宜。这与 25 年前的情况几乎完全相反。
不幸的是,盲 FLOP 计数作为算法价值的绝对指标的做法已经远远超过其销售日期。现代科学计算是更多关于内存的带宽管理-试图让该执行单元做的触发器与数据不断喂-比约减少触发器的数目。对LINPACK的引用(基本上已被LAPACK废弃20 年前)让我怀疑您的雇主可能是一个非常古老的学校,没有内化建立绩效预期不再只是 FLOP 计数的问题。如果具有更有利的内存访问模式和数据布局,那么执行两倍 FLOP 的求解器仍可能比另一个求解器快 20 倍。
所有这一切的结果是,计算密集型软件的性能评估变得比过去复杂得多。由于内存操作和分支成本的巨大变化,FLOP 变得便宜的事实变得非常复杂。当谈到评估算法时,简单的 FLOP 计数根本不会再告知整体性能预期。
或许所谓的屋顶线模型提供了一种更好的思考性能期望和评估的方式,它远非完美,但其优点是让您在考虑浮点和内存带宽问题之间的权衡时同时,提供更多信息和洞察力的“二维图片”,可以比较性能测量和性能预期。
值得一看。
| 归档时间: |
|
| 查看次数: |
33951 次 |
| 最近记录: |