衡量一个算法时,如果有除法运算,如何计算FOP总数和浮点性能?
比如n2矩阵乘法,计算n3 * 2flops(一次乘法,一次加法),假设使用相同的数据集n2,我们把矩阵乘法的乘法运算改成除法运算,如何计算flops。和矩阵相乘的结果一样吗?
唉,没有一个标准来指定什么是浮点运算。
这是因为不同的架构可能对不同的操作集具有原生支持。
例如,架构A 1可能支持所有四种基本操作,A 2仅支持加法,A 3支持所有基本操作以及求幂。
一般来说,浮点运算这个术语是高度上下文化的,并且与特定的机器相关联。
但是,您可以通过分别计算每种操作来进行良好的机器独立分析。
这需要一些专业知识和巫术,例如加法和减法是一起计算的,因为它们对于硬件来说基本上是相同的操作。
乘法和除法是分开计算的,就像更复杂的运算(指数、三角函数等)一样。
最后,您将对所有不同的操作进行计数。
例如,将一个n × m矩阵乘以一个m × k矩阵涉及n · k · m次乘法和n · k ·( m -1) 次加法。所以结果是n · k · m MUL + n · k ·( m -1) ADD。
从这个“全信息”表达式本身通常是一个很好的结果,您可以通过选择参考机器和度量单位来获得“浮点运算”数量的近似值。
例如,英特尔的 Skylake 微架构有这个非常简化的时序表:
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就可以完成。
这是一个简化的视图,实际机器要复杂得多(例如 Skylake 具有矢量单位和FMA支持,可能会改变测量单位和时间)。
无论如何,不同类型的操作的表达式是独立于机器的,并且可以在稍后进行特定情况时转换为单个数字。