c++ - 如何计算FOP总数和特殊运算的浮点性能(exp sin sqrt)?

标签 c++ flops

衡量一个算法时,如果有除法运算,如何计算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/

相关文章:

c - FLOPS 什么是真正的 FLOP

architecture - 什么算是翻牌圈?

c++ - DirectX HLSL 着色器隐式截断 vector 类型错误

c++ - 在临时对象上调用方法

c++ - 以 FLOPS 估算 GPU 的效率(CUDA SAMPLES)

cpu - 现代 FPGA 的性能相对于 CPU 的绝对性能是多少(GFlops/GIops)?

double - 在 GPU 上,是否可以通过结合 double 和浮点运算来获得更多的触发器?

c++ - 需要 GLIBC 2.7 版本。使用更高版本的 GLIBC 编译 C++ 代码,同时支持更早的 glibc

c++ - 使用 maven-nar-plugin 在 Maven 中构建 C++ 项目

c++ 变量赋值,这是一种正常的方式吗..?