衡量一个算法时,如果有除法运算,如何计算FOP总数和浮点性能?
比如n2矩阵乘法,计算n3 * 2flops(一次乘法,一次加法),假设使用同一个数据集n2,我们把矩阵乘法的乘法运算改成除法运算,flops如何计算.和矩阵相乘的结果一样吗?
最佳答案
唉,没有一个标准来指定什么是浮点运算。
这是因为不同的架构可能对不同的操作集有原生支持。
因此,例如,体系结构 A1 可能支持所有四种基本操作,A2 仅支持加法和 < em>A3 所有基本运算加上求幂。
一般来说,术语浮点运算是高度语境化的,并且与特定机器相关联。
但是,您可以通过分别计算每种操作来进行良好的机器独立分析。
这需要一些专业知识和巫术,例如加法和减法一起计算,因为它们对硬件来说基本上是相同的操作。
乘法和除法是分开计算的,就像更复杂的运算(求幂、三角函数等)一样。
最后,您将对所有不同的操作进行计数。
例如,将 n × m 矩阵乘以 m × k 一个矩阵涉及 n·k·m乘法和n·k·(m-1 )补充。所以结果是n·k·m MUL + n·k· (m-1) 添加。
从这个“全信息”表达式(它本身通常是一个很好的结果)中,您可以通过选择引用机器和度量单位来获得“浮点运算”数量的近似值。
例如 Intel 的 Skylake 微架构有这个,非常简化 timings table :
Operation Cycles
Addition 0.5
Subtraction 0.5
Division 3
Multiplication 0.5
如果以加法为一个FLOP的度量单位,可以说一个除法有6个加法那么长,相当于6个FLOP。
Operation FLOPs
Addition 1 (By definition)
Subtraction 1
Division 6
Multiplication 1
所以上面的例子减少到 n·k·(2·m - 1) 因为乘法和加法都只需要 1 次 FLOP去完成。
这是一个简化的 View ,真实的机器要复杂得多(例如 Skylake 有 vector 单位和 FMA 支持,可能会改变测量单位和时间)。
不管怎样,不同类型操作的表达是机器无关的,以后在具体情况下可以转换成一个数字。
关于c++ - 如何计算FOP总数和特殊运算的浮点性能(exp sin sqrt)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41321985/