1)我可以非常清楚地看到:计算机在一秒钟内可以完成的浮点运算次数是量化其性能的好方法。那是对的,对吧?
2)我的老师一直要我计算我编程的算法的翻牌率。我这样做是通过计算算法执行的触发次数以及计算运行所需的时间来完成的。在这种情况下,翻牌速率总是低于我对我正在使用的计算机所期望的翻牌速度。因此对于算法来说,翻牌率更多的是评估“其他东西”需要多长时间(即开销,不涉及翻牌的东西)。也就是说,当翻牌计数很低时,大部分节目时间用于调用功能等而不执行翻牌,对吗?
我知道这是一个非常广泛的问题但是我希望工业界或学术界的人能够提出一些他们直觉上认为算法的翻牌率实际上是什么的想法。
答案 0 :(得分:1)
正确地说,“触发器”是衡量处理器或系统性能的标准。许多人滥用它作为实现或算法速度的衡量标准。
假设您有一个要执行的计算,它在所需的操作数中是固定的。例如,您希望将尺寸为a•b的矩阵与尺寸为b•c的矩阵相乘。如果以通常的方式执行此乘法,则在行中的一行和一列c列的每个组合中,执行b乘法和b-1加法。因此整个矩阵乘法采用•c•(2b-1)浮点运算。如果它在一秒内结束,有人会说它提供了一个•c•(2b-1)的翻牌。
如果你有两个程序都以相同的方式进行乘法运算,你可以用这个数字比较它们。其中一个有更多“翻牌”的人更好。即使他们使用相同的算法,其中一个可能有更好的实现,也许是因为它可以更有效地组织工作以进行内存缓存。
当有人找出一个新算法,用较少的操作完成同样的工作时,这就会中断。然后有些人使用原始方法的标称操作次数来比较程序(或例程),即使程序实际执行的操作较少。
在某种程度上,这是有道理的。如果你有两个程序执行相同的工作,并且其中一个程序以这种方式计算的“翻牌”数量较多,那么程序可以更快地为你提供答案。
但是,它引入不准确的程度是没有意义的。我们通常对单个问题大小不感兴趣,但是对于各种大小,一旦使用新算法,程序的“触发器”将不会与标称操作次数成线性比例。
通过类比,假设在每个人使用的山路上从A镇到B镇是80公里。如果你的车需要一个小时才能完成旅行,那么你的车每小时行驶80公里。在探索某一天的过程中,您会发现穿越山脉的旅行将旅行减少到70公里。现在你可以在52.5分钟内完成旅行。一些人使用“翻牌”的计算结果与你说,你的车每小时行驶91.4公里,因为它可以在52.5分钟内完成80公里的行程。
这显然是错误的。但是,它对决定采用哪条路线很有用。
答案 1 :(得分:0)
FLOPS表示由处理器执行的每秒浮点运算量。这可以是源自某些硬件/体系结构规范的纯理论数字,也可以是运行某些算法以获得高数字的经验结果。
FLOPS计算中的主要问题来自一个系统,其中有多个并行执行块。 AFAIK,仅在这种情况下,开始变得非常难以将实际算法(例如,FFT或RGB-> YUV转换)分成使用CPU中的所有计算单元的最有用的指令集。 (例如,没有自动矢量化,x64系统通常只在Xmm0 [0]寄存器中计算浮点运算,浪费了50-75%的全部电位。)
这部分回答了问题2.除了缓存/存储器引入的明显停顿以注册带宽之外,最大FLOPS数据的下一个关键障碍是数据位于错误的寄存器中。这在复杂性分析中经常被完全忽略,就像FLOPS计算只计算基本算术运算一样。在并行编程的情况下,经常发生的是,错误的寄存器中不仅有一个,而是4个,8个或16个值,而没有任何方法可以同时轻松地将它们全部置换掉。将其添加到算法中的开销,“预热”和“冷却”阶段,该算法试图占用具有有意义数据的所有计算单元,并且主要原因是从1GFLOPS系统中获得100个MFlop。