在我看来,我并不完全理解 FLOPS 的概念。在CUDA SAMPLES中,有矩阵乘法示例(0_Simple/matrixMul)。在此示例中,每个矩阵乘法的 FLOP(浮点运算)数量通过以下公式计算:
double flopsPerMatrixMul = 2.0 * (double)dimsA.x * (double)dimsA.y * (double)dimsB.x;
所以,这意味着,为了将矩阵相乘A(n x m)
over B(m x k)
,我们需要做:2*n*m*k
与浮点运算。
然而,为了计算结果矩阵的 1 个元素C (n x k)
,一个人必须执行m
乘法和(m-1)
加法运算。因此,操作总数(计算n x k
元素),是m*n*k
乘法和(m-1)*n*k
补充。
当然,我们可以设置添加的数量m*n*k
以及,操作总数将是2*n*m*k
,其中一半是乘法,一半是加法。
但是,我猜乘法比加法的计算成本更高。为什么这两种类型的操作会混合在一起?计算机科学中总是这样吗?如何考虑两种不同类型的操作?
对不起我的英语不好)
简短的回答是,是的,他们计算乘法和加法。尽管大多数浮点处理器具有融合乘法/加法运算,但它们仍然将乘法和加法算作两个单独的浮点运算。
这就是为什么人们几十年来一直抱怨 FLOPs 基本上是一个毫无意义的衡量标准。即使是一点点,您几乎需要指定一些特定的代码体来测量 FLOP(例如,“Linpack gigaflops”)。即使如此,您有时也需要对诸如允许哪些编译器优化之类的事情进行相当严格的控制,以确保您测量的是真正的机器速度,而不是编译器简单地消除某些操作的能力。
最终,正是出于诸如此类的担忧,人们成立了一些组织来制定基准以及如何运行这些基准和报告结果的规则(例如 SPEC)。否则,可能很难确定您看到的两个不同处理器报告的结果在任何有意义的方面确实具有可比性。即使有了它,比较也可能很困难,但如果没有这些东西,它们就几乎毫无意义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)